En nuestro modelo de compilador, el
analizador sintáctico obtiene una cadena de
tokens del analizador léxico y verifica que la
cadena de nombres de los tokens pueda
generarse mediante la gramática para el
lenguaje fuente.
Esperamos que el anali- zador sintáctico reporte
cualquier error sintáctico en forma inteligible y que
se recupere de los errores que ocurren con
frecuencia para seguir procesando el resto del
programa
Existen tres tipos generales de analizadores para
las gramáticas: universales, descendentes y
ascendentes
Representación de gramáticas.
Algunas de las gramáticas se
presentan para facilitar la
representación de gramáticas. Las
construcciones que empiezan con
palabras clave como while o int son
muy fáciles de analiza
Manejo de los errores sintácticos El resto de esta sección considera la
naturaleza de los errores sintácticos y las estrategias generales para
recuperarse de ellos. Dos de estas estrategias, conocidas como
recuperaciones en modo de pánico y a nivel de frase, se describirán con
más detalle junto con los métodos espe- cíficos de análisis sintáctico.
Los errores léxicos incluyen la escritura
incorrecta de los identificadores, las
palabras clave o los operadores.
Los errores sintácticos incluyen la
colocación incorrecta de los signos de
punto y coma, ade- más de llaves
adicionales o faltantes.
Los errores semánticos incluyen los
conflictos de tipos entre los operadores y
los operandos. Un ejemplo es una
instrucción return en un método de Java,
con el tipo de resultado void .
os errores lógicos pueden ser cualquier cosa,
desde un razonamiento incorrecto del pro-
gramador en el uso (en un programa en C) del
operador de asignación = , en vez del operador
de comparación ==.
Estrategias para recuperarse de los errores. Una vez que se detecta un error,
¿cómo debe recuperarse el analizador sintáctico? Aunque no hay una estrategia
que haya demostrado ser aceptable en forma universal, algunos métodos pueden
aplicarse en muchas situaciones
Recuperación en modo de pánico. Con este método, al
describir un error el analizador sintáctico descarta los
símbolos de entrada, uno a la vez, hasta encontrar un
conjunto designado de tokens de sincronización .
Gramáticas libres de contexto. Si utilizamos una variable
sintáctica instr para denotar las instrucciones, y una
variable expr para denotar las expresiones.
Los terminales son los símbolos básicos a partir de los cuales se
forman las cadenas. El término “nombre de token” es un sinónimo de
“terminal”; con frecuencia usaremos la palabra “token” en vez de
terminal, cuando esté claro que estamos hablando sólo sobre el
nombre del token.
Los no terminales son variables sintácticas que denotan
conjuntos de cadenas. En (4.4), instr y expr son no
terminales. Los conjuntos de cadenas denotados por los no
terminales ayudan a definir el lenguaje generado por la
gramática.
La construcción de un árbol de análisis sintáctico puede
hacerse precisa si tomamos una vista derivacional, en la
cual las producciones se tratan como reglas de rescritura.
Empezando con el símbolo inicial, cada paso de rescritura
sustituye a un no terminal por el cuerpo de una de sus
producciones.