Pila semántica en un analizador sintáctico

Wikipedia

El problema que tengo es entender la fase final «análisis semántico» y cómo se diferencia de la segunda etapa «análisis sintáctico». A mi entender, la fase final «análisis semántico» también valida los tokens que han sido validados por el «análisis sintáctico» y luego imprime la salida.
En general, el objetivo del análisis sintáctico es convertir un flujo de tokens (generado por el análisis léxico) en algún tipo de representación estructurada de lo que el programa «quiere decir». Por ejemplo, en el análisis sintáctico, se espera que los tokens a, / y b se conviertan en algo que diga «el cociente de a y b». Normalmente, el resultado del análisis sintáctico es un árbol sintáctico abstracto, que es una estructura de árbol que codifica la estructura del programa.
El trabajo del análisis semántico es asegurarse de que la representación generada por el paso de análisis sintáctico realmente «tiene sentido». Por ejemplo, supongamos que el analizador sintáctico ha convertido a, /, y b en «el cociente de a y b». En el momento en que el analizador sintáctico hizo esto, probablemente no tenía ninguna idea de cuáles eran los tipos de a y b; lo más probable es que el analizador sintáctico simplemente viera que esto podía interpretarse como una expresión matemática y dejara las cosas así. Sin embargo, es muy posible que no sea una operación bien definida. Por ejemplo, si a es una cadena y b es un booleano, entonces a / b es una operación sin sentido y el compilador debería informar de un error.

Qué es el analizador sintáctico en el diseño de compiladores

El parsing, análisis sintáctico o análisis sintáctico es el proceso de análisis de una cadena de símbolos, ya sea en lenguaje natural, lenguajes informáticos o estructuras de datos, conforme a las reglas de una gramática formal. El término parsing viene del latín pars (orationis), que significa parte (del discurso)[1].
El término tiene significados ligeramente diferentes en distintas ramas de la lingüística y la informática. El análisis sintáctico tradicional de las frases suele realizarse como método para comprender el significado exacto de una frase o palabra, a veces con la ayuda de dispositivos como los diagramas de frases. Suele hacer hincapié en la importancia de las divisiones gramaticales, como el sujeto y el predicado.
Dentro de la lingüística computacional, el término se utiliza para referirse al análisis formal por parte de un ordenador de una frase u otra cadena de palabras en sus componentes, lo que resulta en un árbol de análisis sintáctico que muestra su relación sintáctica entre sí, que también puede contener información semántica y de otro tipo (valores p) [cita requerida] Algunos algoritmos de análisis sintáctico pueden generar un bosque de análisis o una lista de árboles de análisis para una entrada sintácticamente ambigua [2].

Ejemplo de análisis sintáctico

El análisis sintáctico es el proceso de analizar una cadena de símbolos, ya sea en lenguaje natural, lenguajes informáticos o estructuras de datos, de acuerdo con las reglas de una gramática formal. El término parsing viene del latín pars (orationis), que significa parte (del discurso)[1].
El término tiene significados ligeramente diferentes en distintas ramas de la lingüística y la informática. El análisis sintáctico tradicional de las frases suele realizarse como método para comprender el significado exacto de una frase o palabra, a veces con la ayuda de dispositivos como los diagramas de frases. Suele hacer hincapié en la importancia de las divisiones gramaticales, como el sujeto y el predicado.
Dentro de la lingüística computacional, el término se utiliza para referirse al análisis formal por parte de un ordenador de una frase u otra cadena de palabras en sus componentes, lo que resulta en un árbol de análisis sintáctico que muestra su relación sintáctica entre sí, que también puede contener información semántica y de otro tipo (valores p) [cita requerida] Algunos algoritmos de análisis sintáctico pueden generar un bosque de análisis o una lista de árboles de análisis para una entrada sintácticamente ambigua [2].

Árbol de parseo

En el proceso de aprendizaje de los compiladores escribí un tokenizador y un analizador sintáctico simple (descenso recursivo). El analizador sintáctico construye un árbol sintáctico abstracto. Ahora voy con el análisis semántico. Sin embargo, tengo algunas preguntas sobre la construcción del analizador semántico. ¿Debería analizar el código semánticamente en el árbol de sintaxis abstracto generado utilizando llamadas recursivas a través del árbol o tal vez debería construir otro árbol (utilizando un patrón de visitante, por ejemplo) con el fin de realizar el análisis semántico. Encontré un documento en línea que dice que debo analizar el código semánticamente durante el proceso de análisis sintáctico, pero no cumple con una regla de responsabilidad única y hace que todo el analizador sintáctico sea más propenso a errores. ¿O tal vez debería hacer el análisis semántico como parte de un generador de representación intermedia? Tal vez me estoy perdiendo algo, estaría agradecido si alguien pudiera aclararme este asunto.
Si decide (algún día) construir un compilador rápido, podría considerar implementar algo de ese análisis semántico mientras parsea. Esto hace que construir tanto el parser como el analizador semántico sea más difícil porque ahora están interactuando (enredado es una palabra mejor, lee sobre por qué la mayoría de los parsers de C++ están implementados con un llamado «hack de lexer» si quieres enfermarte). También encontrarás que a veces la información que necesitas no está disponible («¿está el objetivo de ese goto definido hasta ahora?») así que normalmente no puedes hacer un trabajo completo mientras se ejecuta el parse, o puede que tengas que retrasar algún procesamiento semántico para más adelante en el parse y eso es complicado de arreglar. No recomiendo añadir este tipo de complejidad al principio de tu formación como compilador.

Acerca del autor

admin

Ver todos los artículos