Foros del Web » Programación para mayores de 30 ;) » Programación General »

necesito realizar un analizador sintactico

Estas en el tema de necesito realizar un analizador sintactico en el foro de Programación General en Foros del Web. Pila entrada salida $E id+id*id$ $E´T id+id*id$ E->TE´ $E´T´F id+id*id$ T->FT´ $E´T´id id+id*id$ F->id $E´T´ +id*id$ $E´ +id*id$ T´-> vacio $E´T+ +id*id$ E´->+TE´ $E’T id*id$ ...
  #1 (permalink)  
Antiguo 26/03/2006, 23:48
 
Fecha de Ingreso: marzo-2006
Mensajes: 1
Antigüedad: 18 años, 1 mes
Puntos: 0
necesito realizar un analizador sintactico

Pila entrada salida
$E id+id*id$
$E´T id+id*id$ E->TE´
$E´T´F id+id*id$ T->FT´
$E´T´id id+id*id$ F->id
$E´T´ +id*id$
$E´ +id*id$ T´-> vacio
$E´T+ +id*id$ E´->+TE´
$E’T id*id$
$E´T´F id*id$ T->FT
$E´T´id id*id$ F->id
$E´T´ *id$
$E´T´F* *id$ T´->+FT´
$E´T´F id$
$E´T´id id$ F->id
$E´T´ $
$E´ $ T´-> vacio
$ $ E´-> vacio


tiene ke cumplir con la siguiente gramatica ademas me debe imprimir la tabla de arriba y no se como acerle

NO TERMINAL id + * ( ) $

E E>TE’ ETE´
E´ E´->+TE´ E´ ε E´ ε
T T->FT´ TFT´
T´ T ε T´*FT T´ ε T´ ε
F F-->id F(E)
  #2 (permalink)  
Antiguo 27/03/2006, 16:31
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
No se si soy bruto, pero eso esta escrito en BNF, EBNF o que?
Segun lo que me enseñaron el facultad es que las gramàticas se expresan en esos lenguajes o con autòmatas.
Bye
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #3 (permalink)  
Antiguo 27/03/2006, 19:38
 
Fecha de Ingreso: diciembre-2005
Ubicación: Ciudad de México
Mensajes: 45
Antigüedad: 18 años, 4 meses
Puntos: 1
Mira la primera duda que me surge es que tipo de analizador requieres, y si no te pidieron ningún tipo en especial te recomiendo que utilices una herramienta llamada yacc. Si no puedes utilizar esta herramienta puedes hacer un analizador por decenso recursivo aquí te presento el código de uno de estos:

Código:
#ifndef _DESCREC2_H_
#define _DESCREC2_H_ 

#include "scanner.h"
#include "tokens.h"

class DescRec{
    public:
    int E(float *ApV,Scanner *scan);
    int Ep(float *ApV,Scanner *scan);
    int T(float *ApV,Scanner *scan);
    int Tp(float *ApV,Scanner *scan);
    int S(float *ApV,Scanner *scan);
    int Sp(float *ApV,Scanner *scan);
    int P(float *ApV,Scanner *scan);
    int F(float *ApV,Scanner *scan);
};
#endif
Código:
#include "descrec2.h"

#include <stdlib.h>
#include <gtk/gtk.h>
#include <math.h>

/*
int DescRec::E(float *ApV,Scanner *scan){
    g_print("-------------inicia----------------\n");
    if(T(ApV,scan))
        if(Ep(ApV,scan))
            return 1;
    return 0;
}

int DescRec::Ep(float *ApV,Scanner *scan){
    int t;
    float aux;
    t=scan->yylex();
    g_print("EP -sig %d\n",t);
    if(t==SUMA || t==RESTA){
        if(T(&aux,scan)){
            if(t==SUMA)
                *ApV=(*ApV+aux);
            
            if(t==RESTA)
                *ApV=(*ApV-aux);
                
            return Ep(ApV,scan);
        }
        return 0;
    }
    scan->regresaToken();
    return 1;
}

int DescRec::T(float *ApV,Scanner *scan){
    if(F(ApV,scan))
        if(Tp(ApV,scan))
            return 1;
    return 0;
}

int DescRec::Tp(float *ApV,Scanner *scan){
    int t;
    float aux;
    t=scan->yylex();
    g_print("TP -sig %d\n",t);
    if(t==PROD || t==DIV){
        if(F(&aux,scan)){
            if(t==PROD)
                *ApV=*ApV*aux;
            if(t==DIV)
                *ApV=*ApV/aux;
                
            return Tp(ApV,scan);
        }
        return 0;
    }
    scan->regresaToken();
    return 1;
}

int DescRec::F(float *ApV,Scanner *scan){
    int t;
    t=scan->yylex();
    g_print("F -sig %d\n",t);
    switch(t){
        case PAR_I:if(E(ApV,scan)){
                t=scan->yylex();
                if(t==PAR_D)
                    return 1;
            }
            return 0;
        case NUM:*ApV=atof(scan->yytext);
            return 1;
        
    }
    return 0;
}*/



int DescRec::E(float *ApV,Scanner *scan){
    if(T(ApV,scan))
        if(Ep(ApV,scan)){
            return 1;
        }
    return 0;
}

int DescRec::Ep(float *ApV,Scanner *scan){
    int t;
    float aux;
    t=scan->yylex();
    if(t==SUMA || t==RESTA){
        if(T(&aux,scan)){
            if(t==SUMA)
                *ApV=(*ApV+aux);
            
            if(t==RESTA)
                *ApV=(*ApV-aux);
                
            return Ep(ApV,scan);
        }
        return 0;
    }
    scan->regresaToken();
    return 1;
}

int DescRec::T(float *ApV,Scanner *scan){
    if(S(ApV,scan))
        if(Tp(ApV,scan))
            return 1;
    return 0;
}

int DescRec::Tp(float *ApV,Scanner *scan){
    int t;
    float aux;
    t=scan->yylex();
    if(t==PROD || t==DIV){
        if(F(&aux,scan)){
            if(t==PROD)
                *ApV=*ApV*aux;
            if(t==DIV)
                *ApV=*ApV/aux;
                
            return Tp(ApV,scan);
        }
        return 0;
    }
    scan->regresaToken();
    return 1;
}

int DescRec::S(float *ApV,Scanner *scan){
    if(P(ApV,scan))
        if(Sp(ApV,scan))
            return 1;
    return 0;
}

int DescRec::Sp(float *ApV,Scanner *scan){
    int t;
    float aux;
    t=scan->yylex();
    if(t==POT || t==RAIZ){
        if(P(&aux,scan)){
            if(t==POT)
                *ApV=powf(*ApV,aux);
            
            if(t==RAIZ)
                *ApV=sqrtf(aux);
                
            return Sp(ApV,scan);
        }
        return 0;
    }
    scan->regresaToken();
    return 1;
}

int DescRec::P(float *ApV,Scanner *scan){
    int t,l;
    float aux;
    t=scan->yylex();
    if(t==SIN || t==COS || t==TAN || t==LOG || t==LN || t==EXP){
        if(F(&aux,scan)){
            if(t==SIN)
                *ApV=sinf(aux);
            if(t==COS)
                *ApV=cosf(aux);
            if(t==TAN)
                *ApV=tanf(aux);
            if(t==LOG)
                *ApV=log10f(aux);
            if(t==LN)
                *ApV=logf(aux);
            if(t==EXP)
                *ApV=expf(aux);
            return 1;
        }
        return 0;
    }
    scan->regresaToken();
    return F(ApV,scan);
}

int DescRec::F(float *ApV,Scanner *scan){
    int t;
    t=scan->yylex();
    switch(t){
        case PAR_I:if(E(ApV,scan)){
                t=scan->yylex();
                if(t==PAR_D)
                    return 1;
            }
            return 0;
        case NUM:*ApV=atof(scan->yytext);
            return 1;
        /*case VAR_X:*ApV=atof(scan->yytext);
            return 1;
        case VAR_Y:*ApV=atof(scan->yytext);
            return 1;*/
    }
    return 0;
}
este código corresponde a un analizador sintáctico para realizar algunas operaciones matemáticas
  #4 (permalink)  
Antiguo 28/04/2006, 07:35
 
Fecha de Ingreso: marzo-2006
Ubicación: Guatemala/Guatemala
Mensajes: 1
Antigüedad: 18 años, 1 mes
Puntos: 0
que tal a todos, necesito una gramatica para reconocer los html no se si alguien me puede ayudar
  #5 (permalink)  
Antiguo 04/11/2008, 22:27
 
Fecha de Ingreso: noviembre-2008
Mensajes: 2
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: necesito realizar un analizador sintactico

por favor me podrian pasar un codigo de un programa de analizador sintactico en c++. se los agradeceria..este es mi correo [email protected]
  #6 (permalink)  
Antiguo 04/11/2008, 22:28
 
Fecha de Ingreso: noviembre-2008
Mensajes: 2
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: necesito realizar un analizador sintactico

por favor me podrian pasar el codigo completo de este analizador sintactico ya que necesito las librerias. se los agradeceria..este es mi correo [email protected]
  #7 (permalink)  
Antiguo 06/11/2008, 12:07
 
Fecha de Ingreso: septiembre-2008
Mensajes: 3
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: necesito realizar un analizador sintactico

hola, tengo una duda si un lenguaje x puede conertirse en monolitico
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:06.