Análisis Sintáctico: Obtiene la cadena de tokens del analizador léxico y verifica que puede ser generada por la gramática que describe el lenguaje fuente
El análisis sintáctico es un análisis a nivel de sentencias,
y es mucho más complejo que el análisis léxico. Su función es tomar el programa
fuente en forma de tokens, que recibe del analizador léxico, y determinar la
estructura de las sentencias del programa. Este proceso es similar a determinar
la estructura de una frase en Castellano, determinando quien es el sujeto,
predicado, el verbo y los complementos.
El análisis sintáctico agrupa a los tokens en clases sintácticas
(denominadas no terminales en la definición de la gramática), tales como
expresiones, procedimientos, etc.
El analizador sintáctico o parser obtiene un árbol
sintáctico (u otra estructura equivalente) en la cual las hojas son los tokens,
y cualquier nodo que no sea una hoja, representa un tipo de clase sintáctica
(operaciones). Por ejemplo el análisis sintáctico de la siguiente expresión:
(A+B)*(C+D)
Con las reglas de la gramática que se presenta a
continuación dará lugar al árbol sintáctico de la figura 3:
<expresión> ::=
<término> <más términos>
<más
términos>::= +<término> <más términos>| - <término>
<más términos> | <vacío>
<término> ::=
<factor> <más factores>
<más
factores>::= * <factor> <más factores>|/ <factor> <más
factores> | <vacío>
<factor> ::= (
<expresión> ) | <variable> | <constante>
La estructura de la gramática anterior refleja la prioridad de
los operadores, así los operadores “+” y “-” tienen la prioridad más baja, mientras
que “*” y “/” tienen una prioridad superior. Se evaluaran en primer lugar las constantes,
variables y expresiones entre paréntesis.
Los árboles sintácticos se construyen con un conjunto de reglas
conocidas como gramática, y que definen con total precisión el lenguaje fuente.
Al proceso de reconocer la estructura del lenguaje fuente se
conoce con el nombre de análisis sintáctico (parsing). Hay distintas clases de
analizadores o reconocedores sintácticos,
pero en general se clasifican en 2 grandes grupos: A.S. Ascendentes
y A.S. Descendentes.
La principal tarea del analizador sintáctico no es comprobar
que la sintaxis del programa fuente sea correcta, sino construir una
representación interna de ese programa y en el caso en que sea un programa
incorrecto, dar un mensaje de error.
Para ello, el analizador sintáctico (A.S.) comprueba que el orden
en que el analizador léxico le va entregando los tokens es válido. Si esto es
así significará que la sucesión de símbolos
que representan dichos tokens puede ser generada por la gramática
correspondiente al lenguaje del código fuente.
Ejemplo: Entrada: “num*num+num Gramática: E ::= E + T | T T ::= T * F | F F ::= num (E: expresión, T: término, F: factor)
No hay comentarios:
Publicar un comentario