DISEÑO DE COMPILADORES I

download DISEÑO DE COMPILADORES I

of 21

Transcript of DISEÑO DE COMPILADORES I

  • 8/3/2019 DISEO DE COMPILADORES I

    1/21

    Compiladores Lxico Sintctico- Grupo 3

    1

    DISEO DE COMPILADORES I

    Trabajo Prctico N 1-2

    Analizador Lxico y Sintctico

    Ao de Cursada: 2011

    Fecha de Entrega: 30/09/11

    Grupo N: 03

    Integrantes: Arguindegui, Juan Mara

    Gonzlez, Hctor

    Miner, Jernimo

    E-Mails: [email protected]

    [email protected]

    [email protected]

    mailto:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]
  • 8/3/2019 DISEO DE COMPILADORES I

    2/21

    Compiladores Lxico Sintctico- Grupo 3

    2

    INDICE

    Contenido

    TEMAS ASIGNADOS .................................................................................................... 3INTRODUCCION ............................................................................................................ 4DECISIONES DE DISEO E IMPLEMENTACION - Lxico ...................................... 5DIAGRAMA TRANSICION DE ESTADOS .................................................................. 6DESCRIPCION DE CLASES Y METODOS IMPLEMENTADOS ............................ 10PROCESO DE CONSTRUCCION DEL SINTACTICO .............................................. 12CONSTRUCCION DE LA GRAMATICA .................................................................. 13PRUEBAS LEXICAS SINTACTICAS ......................................................................... 20CONCLUSION .............................................................................................................. 21

  • 8/3/2019 DISEO DE COMPILADORES I

    3/21

    Compiladores Lxico Sintctico- Grupo 3

    3

    TEMAS ASIGNADOS

    Parte I

    Constante Doubl Sentencia de iteracin While do Comentario de varias lneas (* *) Cadenas para impresin

    Parte II

    Estructuras como tipo de datos Agregar el tipo de datos Integer para contemplar estructuras

  • 8/3/2019 DISEO DE COMPILADORES I

    4/21

    Compiladores Lxico Sintctico- Grupo 3

    4

    INTRODUCCION

    El anlisis lxico se encuentra en la primera de las etapas de procesamiento de un

    compilador. Esta etapa divide el programa fuente en unidades llamadas tokens.

    Un tokenes un conjunto de caracteres con un significado especfico. Este conjunto

    de caracteres se denomina lexemao valor lxicodel token. Un token puede ser:

    palabras reservadas, operadores, identificadores, constantes, etc. Se utilizan acciones

    semnticas para distinguir identificadores de palabras reservadas, retornar errores

    lxicos entre otras funciones.

    El analizador lxico le entrega al analizador sintctico una tira de tokens formada

    por una dupla (tipo de token y lexema), en el caso de que el tipo de token es nico no

    se pasa su valor. Adems, reconoce errores y elimina caracteres blancos, tabs, saltos

    de lnea, etc. Por otra parte, el analizador lxico genera entradas en la tabla de

    smbolospara los identificadores y constantes que encuentra en el cdigo fuente y

    devuelve al analizador sintctico el valor del token con una referencia a ese

    identificador o constante.

    La tabla de smbolos es una estructura de datos que contiene un registro para

    cada uno de los identificadores y constantes que posee el programa fuente, contiene

    atributos de cada smbolo.

    En etapas posteriores al analizador lxico se completan los atributos de cada

    smbolo, puede ser necesario generar nuevas entradas a la tabla de smbolos cuando

    el mismo nombre se usa para identificar distintos elementos.

    La segunda parte del Trabajo tiene por objeto indicar los detalles de diseo e

    implementacin de un analizador sintctico.

    Para esto se utiliz la herramienta Byacc provista por la ctedra que toma por

    entrada una gramtica libre del contexto y retorna un parser implementado en cdigo

    Java .La tarea realizada por el parser consiste en pedir tokens al analizador lxico y

    verificar que se cumplan las reglas definidas por la gramtica (escritas en BNF),adems de ejecutar las acciones asociadas a dichas reglas.

    Nuestro trabajo consisti en definir la gramtica y las acciones asociadas para un

    lenguaje reducido provisto por la ctedra que sirvi como entrada al generador de

    parser; adems debimos adaptar el analizador lxico transformndolo en una rutina

    yylex().

  • 8/3/2019 DISEO DE COMPILADORES I

    5/21

    Compiladores Lxico Sintctico- Grupo 3

    5

    DECISIONES DE DISEO E IMPLEMENTACION - Lxico

    Se considera como error lxico a aquellos identificadores que superan los 12caracteres de largo. La opcin en este caso se trunca el identificador y se

    informa por pantalla como warring.En el caso de los identificadores que se generan como parte de una estructura,se contempla la misma tcnica antes y despus del punto.

    Las palabras reservadas se almacenan en una estructura independiente (Tablade Palabras Reservadas) a la Tabla de Smbolos. La razn de esta decisin esque de esta manera la bsqueda de palabras reservadas es ms eficiente.Para la implementacin de la Tabla de Palabras Reservadas se utilizo el tipovector propio de la librera estndar de java; dado que las palabras reservadasson fijas, por lo que pueden ser almacenadas en una estructura esttica.

    La Tabla de Smbolos fue implementada utilizando el tipo de estructura dealmacenamiento dinmica, ya que el tamao de esta puede variar dependiendodel cdigo de entrada.

    Se implementa una clase Smbolo

  • 8/3/2019 DISEO DE COMPILADORES I

    6/21

    Compiladores Lxico Sintctico- Grupo 3

    6

    DIAGRAMA TRANSICION DE ESTADOS

    Identificador

    Constante

    Asignacin

  • 8/3/2019 DISEO DE COMPILADORES I

    7/21

    Compiladores Lxico Sintctico- Grupo 3

    7

    Comparaciones

    Comentarios

    Cadena

  • 8/3/2019 DISEO DE COMPILADORES I

    8/21

    Compiladores Lxico Sintctico- Grupo 3

    8

    Caracteres Simples e Invlidos

    Caracteres Especiales

    MATRIZ DE PASAJE

    MATRIZ DE FUNCIONES ASOCIADAS

  • 8/3/2019 DISEO DE COMPILADORES I

    9/21

    Compiladores Lxico Sintctico- Grupo 3

    9

    Nomenclatura de funciones

    A01 AccionAcumularA02 AccionRetornarSuma

    A03 AccionRetornarRestaA04 AccionRetornarMultiplicacionA05 AccionRetornarDivisionA06 AccionRetornarParentesisCerradoA07 AccionRetornarLlaveAbiertaA08 AccionRetornarLlaveCerradaA09 AccionRetornarComaA10 AccionRetornarPuntoComaA11 AccionIgnorarA12 AccionErrorCaracterInvalidoA13 AccionRetornarEOF

    A14 AccionRetornarIdentificadorA15 AccionErrorDoubleEnteroA16 AccionRetornarEnteroA17 AccionRetornarPuntoA18 AccionErrorDoubleExponenteA19 AccionErrorDoubleSignoExponenteA20 AccionErrorAsignacionA21 AccionRetornarAsignacionA22 AccionRetornarMenorA23 AccionRetornarMenorIgualA24 AccionRetornarMayorA25 AccionRetornarMayorIgualA26 AccionErrorIgualA27 AccionRetornarIgualA28 AccionErrorDistintoA29 AccionRetornarDistintoA30 AccionInicioComentarioA31 AccionRetornarParentesisAbiertoA32 AccionWarningComentarioA33 AccionRetornarCadenaA34 AccionErrorCadena

    A35 AccionErrorDoublePuntoA36 AccionRetornarDoubleA37 AccionErrorDoubleExponente

  • 8/3/2019 DISEO DE COMPILADORES I

    10/21

    Compiladores Lxico Sintctico- Grupo 3

    10

    DESCRIPCION DE CLASES Y METODOS IMPLEMENTADOS

    Clase < Token >

    Descripcin: Utilizada para representar todos los token detectados por el analizadorLxico. Est compuesta por Lexema y el nombre del token.Implementando los mtodos getters y setters de las variables de dicha clase.

    Clase < Smbolo >

    Descripcin: Utilizada para representar cada uno de los Smbolos de la consideradaTabla de Smbolos. Est compuesta por 3 variables, nombre, valor y contadores dereferencias. Este ltimo se utiliza para negativizar los valores segn reglasgramaticales.

    Clase < TablaSimbolo >

    Descripcin: Utilizada para incorporar/modificar/eliminar los smbolos detectados atravs de un Vector en su representacin.

    Mtodos: agregarSimbolos (permite agregar smbolos una vez detectados por ellxico) y controlar para no repetir smbolos en el mismo y poder manejar el contadorde referencia a dicho smbolo.

    - Contiene Smbolo ( para saber si el smbolo ya se encuentra en la tabla)- Eliminar (para eliminar un smbolo de la tabla)- Tratar doubl negativo ( normaliza el numero en el caso de los float, verifica si

    ya se encuentra en la TS y tambin si entro por regla sintctica y es negativo lomodifica )

    - Imprimir ( enva a la parte grafica el smbolo y as poder mostrarlo)

    Clase

    Descripcin: Utilizada para tener almacenadas en un vector las palabras reservadasconsideradas en nuestro analizador.

    Mtodos: esPalabraReservada (para saber si es una palabra reservada o no)

    Interface

    Descripcin: Se utiliza para agrupar todas las acciones dependiendo del estado en quese encuentra y del carcter de entrada identificado.

  • 8/3/2019 DISEO DE COMPILADORES I

    11/21

    Compiladores Lxico Sintctico- Grupo 3

    11

    Mtodo Abstracto: Run, ejecutar la accin determinada dependiendo de quin loimplemente

    Clase

    Descripcin: Se utiliza para almacenar la una accin determinado y para determinar elestado siguiente.

    Mtodos: getters y setters para las variables contenidas, (Accin y prximo estado).

    Clase

    Descripcin: Es utilizada para almacenar para representar la transicin de estados y lamatriz de acciones asociadas al analizador.

    Mtodo: agregar Celda, es por el cual se agregan todas las celdas al seteo inicial.

    Clase

    Descripcin: Es el encargado de decodificar las entradas de caracteres e indicar lacolumna y fila de la matriz que le corresponde segn la codificacin planteada.Tambin es el encargado de crear el token vacio para iniciar cada token hasta que ellxico nos devuelva uno valido.

    Mtodos: ObtenerTokens es la crea el token inicial y retornar despus de aplicar lasfunciones correspondientes a las entradas de caracteres y a los estados por donde seva moviendo.

    - Obtener columna- Preguntar por el valor del carcter

    Clase

    Descripcin: Es la representacin del archivo para con el programa, entregndole uno

    por uno los caracteres al analizador lxicoNota de Implementacin: Por cada una de las acciones que se consideran en la matrizde acciones, se crearon las clases correspondiente extendiendo a la interfaz de accin

  • 8/3/2019 DISEO DE COMPILADORES I

    12/21

    Compiladores Lxico Sintctico- Grupo 3

    12

    PROCESO DE CONSTRUCCION DEL SINTACTICO

    La tarea inicial consisti en la adaptacin del analizador lxico de la entrega

    anterior, ya que la herramienta byacc llama a una rutina yylex la cual retorna un

    nmero entero correspondiente a cada token y nuestro analizador lxico retornaba el

    tipo tokens (definido por nosotros). Para poder realizar dicha adaptacin definimos

    una funcin comentada que toma como entrada un token y retorna una constante

    entera que es lo que espera el parser, Dichas constantes son las que genera la

    herramienta byacc al momento de procesar la gramtica.

    Por otro lado, para devolver el puntero a la tabla de smbolos redefinimos el tipo de

    la variable yylval como puntero al tipo smbolo (definido por nosotros).

    Luego comenzamos a construir la gramtica y tratar de contemplar la mayor

    cantidad de errores. (Se explica ms abajo en mayor detalle)

  • 8/3/2019 DISEO DE COMPILADORES I

    13/21

    Compiladores Lxico Sintctico- Grupo 3

    13

    CONSTRUCCION DE LA GRAMATICA

    Como primer punto definimos la lista de token que se iban a considerar y as

    permitirle a byacc nos genere automticamente todos las constaste para facilitar la

    comunicacin entre lxico y sintctico y sin tener que ver que numeracin ASCII le

    corresponde a cada token.

    Nota: en la definicin (abajo) de gramtica no se muestran los mensaje de error de

    salida para hacerla ms legible, pero sin son consideradas en el apartado 8.

    DEFINICION

    %token PUNTO_COMA INTEGER DOUBLE ESTRUCTURA IDENTIFICADOR

    COMA ASIG MAS MENOS MULT DIV NUMERO STRUCT LLAVE_ABRE

    LLAVE_CIERRA BEGIN END PARENTESIS_ABRE PARENTESIS_CIERRA MENOR

    MAYOR IGUAL MAYOR_IGUAL MENOR_IGUAL DISTINTO IF ELSE WHILE DO

    PRINT CADENA

    REGLAS

    Programa: estructuras declaraciones ejecutables;

    Nota = con esto limitamos al programa que primero obligamos a la construccin a

    los tipos de datos, en nuestro caso estructuras. Y as poder controlar que cuando

    definamos una variable tipiada ver que fue declarado el tipo, de lo contrario producira

    un error.

    Siguiendo esta la parte de declaraciones de variables.

    Y por ltimo las ejecutables, que representan a las sentencias que fueronconsideradas.

    Rama de estructuras

    estructuras: /* estructura vacas*/ Nota = Se permite sin estructuras definidas

    | estructuras estructura ;

    estructura: STRUCT IDENTIFICADOR LLAVE_ABRE cuerpo_est LLAVE_CIERRAPUNTO_COMA

  • 8/3/2019 DISEO DE COMPILADORES I

    14/21

    Compiladores Lxico Sintctico- Grupo 3

    14

    | STRUCT IDENTIFICADOR LLAVE_ABRE cuerpo_est LLAVE_CIERRA

    | STRUCT IDENTIFICADOR cuerpo_est LLAVE_CIERRA PUNTO_COMA

    | STRUCT IDENTIFICADOR LLAVE_ABRE cuerpo_est PUNTO_COMA

    | STRUCT LLAVE_ABRE cuerpo_est PUNTO_COMA

    | STRUCT error PUNTO_COMA

    | STRUCT error

    cuerpo_est: sen_est

    | cuerpo_est sen_est;

    sen_est: INTEGER IDENTIFICADOR PUNTO_COMA

    | IDENTIFICADOR PUNTO_COMA

    | error IDENTIFICADOR PUNTO_COMA

    | INTEGER error PUNTO_COMA

    | INTEGER IDENTIFICADOR error

    ;

    Nota de las estructuras: te permite la construccin recursiva de estructuras, con la

    posibilidad de no crear estructuras, a partir de definir la primer regla como vaca.

    Como consideracin se puede decir que nuestra definicin correcta de una estructura

    debe terminar en ; como cualquier tipo de sentenciaLuego se define el contenido de las sentencias internas de forma recursiva pero

    obligando que al menos se defina una variable dentro de la estructura

    Y por ltimo la declaracin real de la variable dentro de la estructura es del Tipo

    INTEGER en todos los casos, como se nos pidi por enunciado y debe terminar en

    punto y coma.

    Ramas de declaraciones

    declaraciones: /*declaracion vacas*/

    | declaraciones declaracion ;

    declaracion: tipo lista_variables PUNTO_COMA

    | tipo lista_variables error

    | tipo error PUNTO_COMA

    | lista_variables PUNTO_COMA ;

    tipo: INTEGER

  • 8/3/2019 DISEO DE COMPILADORES I

    15/21

    Compiladores Lxico Sintctico- Grupo 3

    15

    | DOUBLE

    | ESTRUCTURA

    ;

    lista_variables: IDENTIFICADOR

    | lista_variables COMA IDENTIFICADOR

    | lista_variables IDENTIFICADOR ;

    Notas de las declaraciones: permite la declaracin recursiva de declaraciones pero

    permitiendo dejar en blanco la parte de declaraciones.

    Una declararon debe terminar en punto y coma, pero debe tener un tipo que en

    nuestro caso pueden ser INTEGER, DOUBLE y ESTRUCTURA (este ltimo nos

    permitira poner validacin de que tenemos declarada la estructura a la hora de definir

    variables de este tipo)

    Adems de tipo nos permite definir la lista de variables.

    Esta lista de variables, puede ser una nica variable

    Ramas de ejecutables

    ejecutables: sentencia

    | ejecutables sentencia;

    sentencia: asignacin

    | seleccin

    | iteracin

    | impresin ;

    asignacin: asign_izq ASIG expresin PUNTO_COMA

    | ASIG expresin PUNTO_COMA

    | ASIG expresin

    | ASIG PUNTO_COMA

    | asign_izq ASIG PUNTO_COMA

    | asign_izq error

    | asign_izq ASIG expresin error

    | asign_izq ASIG error PUNTO_COMA| asign_izq ASIG error;

  • 8/3/2019 DISEO DE COMPILADORES I

    16/21

    Compiladores Lxico Sintctico- Grupo 3

    16

    asign_izq: IDENTIFICADOR

    | IDENTIFICADOR PUNTO IDENTIFICADOR;

    expresin: expresin MS termino

    | expresin MENOS termino

    | termino

    | expresin MAS error

    | expresin MENOS error ;

    termino: termino MULT factor

    | termino DIV factor

    | factor

    | termino MULT error

    | termino DIV error ;

    factor: IDENTIFICADOR

    | NUMERO

    | MENOS NUMERO;

    seleccin: IF condicin bloque ELSE bloque

    | IF error

    | IF condicin error ELSE bloque

    | IF condicin bloque error

    | IF condicin bloque ELSE ;

    condicin: PARENTESIS_ABRE expresion_logica PARENTESIS_CIERRA

    | PARENTESIS_ABRE expresion_logica| expresion_logica PARENTESIS_CIERRA

    |expresion_logica

    | PARENTESIS_ABRE error PARENTESIS_CIERRA ;

    expresion_logica: expresin operador_logico expresin ;

    operador_logico: MENOR

    | MAYOR| IGUAL

  • 8/3/2019 DISEO DE COMPILADORES I

    17/21

    Compiladores Lxico Sintctico- Grupo 3

    17

    |MAYOR_IGUAL

    |MENOR_IGUAL

    | DISTINTO;

    Bloque: BEGIN ejecutables END

    | BEGIN ejecutables error

    | BEGIN error END

    | ejecutables END

    | ejecutables error ;

    iteracin: WHILE condicin DO bloque

    | WHILE error DO bloque

    | WHILE condicin error bloque

    | WHILE condicin DO error ;

    impresin: PRINT PARENTESIS_ABRE CADENA PARENTESIS_CIERRA

    PUNTO_COMA

    | PRINT PARENTESIS_ABRE PARENTESIS_CIERRA PUNTO_COMA

    | PRINT PARENTESIS_ABRE CADENA PARENTESIS_CIERRA

    | PRINT PARENTESIS_ABRE CADENA PUNTO_COMA| PRINT CADENA PARENTESIS_CIERRA PUNTO_COMA

    | PRINT error CADENA PARENTESIS_CIERRA PUNTO_COMA

    | PRINT PARENTESIS_ABRE error PARENTESIS_CIERRA

    PUNTO_COMA

    | PRINT PARENTESIS_ABRE CADENA error PUNTO_COMA

    | PRINT PARENTESIS_ABRE error

    | PRINT PARENTESIS_ABRE IDENTIFICADOR error ;

    Ramas de ejecutables

    Permite la declaracin de las sentencias o lo que normalmente se llamara cuerpo del

    programa, pero a diferencia de las sentencias anteriores declarativas y estructuras,

    esto obliga a tener al menos una sentencia en el cuerpo.

    El tipo de sentencia que se pueden declarar en el cuerpo son las asignaciones, la

    seleccin, la iteracin y la impresin.

  • 8/3/2019 DISEO DE COMPILADORES I

    18/21

    Compiladores Lxico Sintctico- Grupo 3

    18

    La asignacin permite reconocer del lado derecho una expresin aritmtica, tambin

    se contemplan los errores cuando faltan el token de asignacin := o cuando no se

    finaliza con ; o cuando no se obtiene del lado derecho una expresin aritmtica.

    La definicin de la expresin aritmtica, comienza a definir la precedencia utilizada en

    la definicin de la gramtica. Se puede ver que en la ltima definicin valida de la

    expresin esta el termino.

    Ac se deja declarada implcitamente la prioridad de operacin MS y MENOS con

    respecto a DIV y POR, lo mismo pasa con el Token MENOS NMERO, que es el de

    menor prioridad.

    Tambin se podra haber definido en la parte superior de la gramtica explcitamente

    con que precedencia se iba a trabajar pero se opto de esta manera por considerarlo

    ms claro a la hora de interpretarla.

    Con respecto a la sentencia seleccin como se detallo por la ctedra y para evitar

    tener un shift reduce por parte del parse, se utiliza como valido la seleccin

    completa, que es aquella que tiene tanto el bloque del IF como el del ELSE al menos

    declarado, lo dems es considerado error sintctico.

    Hay cosas para marcar fue considerar un tratamiento especial para con las sentencias

    que finalicen en un bloque, es nuestro caso adems de las seleccin, tenemos la

    iteracin. El problema se presentaba que no las podemos considerar que terminaran

    en ; y dejar que el bloque lo determine en este caso.

    METODOS AGREGADOS SOBRE LA GRAMATICA

    Como parte de integrar la gramtica y el parser para con el lxico declarado en una

    primera parte, se considera las siguientes declaraciones:

    Como primer punto redefinimos el constructor de Parser para que este reconozca la

    parte grafica con las estructura definidas.

    Otras funciones generales son:

  • 8/3/2019 DISEO DE COMPILADORES I

    19/21

    Compiladores Lxico Sintctico- Grupo 3

    19

    void mostrarError : nuestra propia funcin para el tratamiento de los errores

    informndolos a nuestro entorno grafico. Se puede observar que el mtodo que nos

    ofrece el Parser el yyerror, se deja si implementar.

    void mostrarSentencia : Se usa para mostrar las sentencias que van detectando las

    gramticas a partir del cdigo de entrada.

    void tratarDoubleNegativo: Esta funcin es la encargada de comunicarse con la tabla

    de smbolo para controlar y negativizar el valor que as fue declarado

    void agregarEstructura: Esta funcin se encarga de cargar en una tabla de estructura

    cuando se declara una, para en el momento que se haga la declaracin de una

    variable de ese tipo, se pueda verificar la previa existencia del tipo utilizado.

    Int decodificarToken: Es que en al reconocer el token, determina su valor constante

    reconocido por el parser.

    int yylex : Por ultimo redefinimos este mtodo, que es la declaracin formar del lxico

    para el parser pero para nosotros representa un mtodo que se comunica con el lxico

    declarado por nosotros en la primera esta, y segn lo que retornar utilizamos eldecodificar el token para que el sintctico lo reconozca como parte de su gramtica.

  • 8/3/2019 DISEO DE COMPILADORES I

    20/21

    Compiladores Lxico Sintctico- Grupo 3

    20

    PRUEBAS LEXICAS SINTACTICAS

    Consideraciones y forma de correr el programa

    PRUEBAS Y

    CONSIDERACIONES

    Hacer Click sobre el archivo para ver

  • 8/3/2019 DISEO DE COMPILADORES I

    21/21

    Compiladores Lxico Sintctico- Grupo 3

    21

    CONCLUSION

    Pudimos ver que la implementacin de un autmata finito para el reconocimiento

    de los tokens en el cdigo fuente por medio de dos matrices: la de transicin de

    estados y la de acciones semnticas, es una buena decisin de diseo dado que la

    misma es extensible y modificable. De haber utilizado condiciones anidadas o cases,

    cualquier cambio o extensin del autmata resultara ms difcil de implementar.

    Durante la etapa de diseo del autmata notamos que tendamos a considerar el

    entorno de los diferentes tokens para su determinacin pero entendimos que esto no

    deba hacerse ya que el reconocimiento de los mismos se basa en una gramtica

    regular, la cual no es sensible al contexto.

    Es importante hacer un buen diseo del autmata finito, haciendo posible de este

    modo, poder reconocer e implementar las acciones semnticas necesarias para la

    deteccin de tokens y errores lxicos

    La utilizacin de la herramienta Byacc nos facilit mucho la tarea de desarrollo de

    este analizador sintctico que de otra manera habra sido una tarea dificultosa.

    Con respecto a la deteccin de errores pudimos ver que no es una tarea tan

    sencilla como parece a simple vista, dado que tratar de mostrar errores en las ramas

    ms bajas de la gramtica, o sea de mayor calidad, trae como consecuencia

    numerosos conflictos gramaticales; por lo que muchas veces los mensajes que se

    muestran no son tan precisos como se deseara. Otro aspecto indeseable en la

    deteccin de errores es la ya mencionada absorcin de sentencias vlidas. Se debe

    tambin tener en cuenta, como en todo anlisis sintctico de este tipo, que muchos de

    los errores que se detectan no son tales, sino una mala interpretacin debido a erroresanteriores. A pesar de ello se pudieron tener en cuenta una cantidad considerable de

    errores y emitir un mensaje de buena calidad.

    Adems, aprendimos que el uso de auxiliares en la definicin de los no terminales,

    como en el caso de las expresiones, no solo nos permiti dar precedencia de

    operadores sino que se evitaron conflictos de ambigedad.