Segunda fase de un compilador
Un analizador sintáctico, también conocido como parser, es un componente fundamental de un compilador que se encarga de analizar la estructura gramatical de un programa o texto. En otras palabras, verifica si la secuencia de palabras y símbolos en un código fuente se ajusta a las reglas gramaticales del lenguaje de programación en cuestión.
El siguiente ejemplo, es la gramática que pertenece al programa de la Figura 2 del tema de analizador léxico, en la Figura 6, se presenta una gramática libre de contexto que define la estructura sintáctica de un mini lenguaje de programación inspirado en español. Esta gramática especifica cómo se componen los programas, declaraciones, instrucciones y expresiones dentro del lenguaje. Por ejemplo, los programas comienzan con la palabra clave inicio, seguidos por declaraciones de variables, un bloque de instrucciones, y terminan con fin. Las instrucciones incluyen operaciones como lectura de identificadores, evaluaciones condicionales y la impresión de cadenas. Esta gramática ilustra las reglas que un analizador sintáctico utilizaría para validar la estructura de un código fuente.

Figura 6. Gramática libre de contexto para un mini lenguaje de programación en español. Elaboración propia en Canva.
Descripción de los componentes de la gramática
Programa: Representa la estructura general de un programa. Se produce como inicio Declaraciones Instrucciones fin.
Declaraciones: Se encarga de la declaración de variables. Se produce como entero Identificador ;.
Instrucciones: Representa una secuencia de instrucciones. Puede ser Instrucción Instrucciones o simplemente Instrucción.
Instrucción: Define las acciones que el programa puede llevar a cabo. Se produce como:
- leer(Identificador) ;
- si (Expresión) entonces Instrucción
- imprimir(Cadena) ;
Expresión: Representa una condición que puede ser evaluada. Se produce como Identificador > 0.
Identificador: Representa el nombre de una variable. En este ejemplo, se produce como x.
Cadena: Representa un texto literal que se puede imprimir. En este caso, se produce como "x es positivo".
Ahora tomamos en cuenta los tokens obtenidos del analizador léxico son:
Tokens [inicio, entero, x, ;, leer, (, x, ), ;, si, (, x, >, 0, ), entonces, imprimir, (, "x es positivo", ), ;, fin ]
Luego el analizador sintáctico usa un árbol sintáctico para verificar la estructura.
En la Figura 7, se presenta el árbol sintáctico generado a partir de la gramática del programa de la Figura 2 que se encuentra en el analizador léxico. Este árbol muestra cómo un analizador sintáctico puede descomponer y validar un programa simple que incluye la declaración de una variable entera, la lectura de su valor, una instrucción condicional, y la impresión de un mensaje. Cada nodo representa una regla de la gramática o un símbolo terminal, evidenciando las relaciones jerárquicas entre los elementos del programa.

Figura 7. Árbol sintáctico para un programa en un mini lenguaje de programación en español. Elaboración propia en Canva.
Explicación del Árbol
- Programa: Nodo raíz que representa el programa completo.
- Declaraciones: Contiene la declaración de la variable x.
- Instrucciones: Contiene las instrucciones que se ejecutan, incluyendo la lectura de x y la estructura condicional.
- Instrucción: Representa cada una de las acciones dentro del programa, como leer, si, y imprimir.
Si todos los tokens encajan con la gramática, el programa es válido, en caso de que algún token o estructura no corresponda a la regla de la gramática, se genera un error sintáctico.
Si quieres profundizar más en el tema, te dejo un video que habla sobre el analizador sintáctico:
María B.[María Berenice Montoya Martínez ]. (2019, 29 de octubre). Analizador Sintáctico [Video]. YouTube. https://www.youtube.com/watch?v=1kGX9N-D37c
Referencias
Ryte. (s.f.). Analizador sintáctico. Ryte. https://es.ryte.com/wiki/Analizador_Sint%C3%A1ctico
Arimetrics. (s.f.). Analizador sintáctico (Parser). Arimetrics. https://www.arimetrics.com/glosario-digital/analizador-sintactico-parser
https://cidecame.uaeh.edu.mx/lcc/mapa/proyecto/libro32/31_funcion_del_analizador_sintctico.html
Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools (2nd ed.). Addison-Wesley.
Appel, A. W. (2004). Modern Compiler Implementation in C. Cambridge University Press.
Cooper, K. D., & Torczon, L. (2003). Engineering a Compiler. Morgan Kaufmann.