Análisis de sintaxis: tipos de análisis de arriba hacia abajo y de abajo hacia arriba del compilador
¿Qué es el análisis de sintaxis?
Análisis de sintaxis Es una segunda fase del proceso de diseño del compilador en la que se verifica la cadena de entrada dada para confirmar las reglas y la estructura de la gramática formal. Analiza la estructura sintáctica y comprueba si la entrada dada está en la sintaxis correcta del lenguaje de programación o no.
El análisis sintáctico en el proceso de diseño de compiladores viene después de la fase de análisis léxico. También se lo conoce como árbol sintáctico o árbol sintáctico. El árbol sintáctico se desarrolla con la ayuda de una gramática predefinida del lenguaje. El analizador sintáctico también verifica si un programa determinado cumple con las reglas implícitas en una gramática libre de contexto. Si las cumple, el analizador crea el árbol sintáctico de ese programa fuente. De lo contrario, mostrará mensajes de error.
¿Por qué necesita el analizador de sintaxis?
- Compruebe si el código es válido gramaticalmente
- El analizador sintáctico te ayuda a aplicar reglas al código.
- Le ayuda a asegurarse de que cada llave de apertura tenga un saldo de cierre correspondiente.
- Cada declaración tiene un tipo y ese tipo debe existir.
Terminología importante del analizador de sintaxis
Terminologías importantes utilizadas en el proceso de análisis de sintaxis:
- Frase: Una oración es un grupo de caracteres sobre algún alfabeto.
- Lexema: Un lexema es la unidad sintáctica de nivel más bajo de un idioma (por ejemplo, total, inicio).
- Token: Un token es solo una categoría de lexemas.
- Palabras clave y palabras reservadas – Es un identificador que se utiliza como parte fija de la sintaxis de una declaración. Es una palabra reservada que no puede utilizar como nombre de variable o identificador.
- palabras ruidosas – Las palabras irrelevantes son opcionales y se insertan en una declaración para mejorar la legibilidad de la oración.
- Comentarios – Es una parte muy importante de la documentación. Se muestra principalmente por, /* */, o//En blanco (espacios)
- Delimitadores – Es un elemento sintáctico que marca el inicio o final de alguna unidad sintáctica. Como una declaración o expresión, “comienzo”…”fin”, o {}.
- Conjunto de caracteres – ASCII, Unicódigo
- Identificadores – Es una restricción de longitud que ayuda a reducir la legibilidad de la oración.
- Operasimbolos tor – + y – realiza dos operaciones aritméticas básicas.
- Elementos sintácticos de la lengua.
¿Por qué necesitamos análisis?
Un análisis también verifica que la cadena de entrada esté bien formada y, si no, la rechaza.
Las siguientes son tareas importantes que realiza el analizador en el diseño del compilador:
- Le ayuda a detectar todo tipo de errores de sintaxis.
- Encuentre la posición en la que se ha producido el error
- Descripción clara y precisa del error.
- Recuperación de un error para continuar y encontrar más errores en el código.
- No debería afectar la compilación de programas "correctos".
- El análisis debe rechazar los textos no válidos informando errores de sintaxis.
Técnicas de análisis
Las técnicas de análisis se dividen en dos grupos diferentes:
- Análisis de arriba hacia abajo,
- Análisis de abajo hacia arriba
Análisis de arriba hacia abajo
En el análisis de arriba hacia abajo, la construcción del árbol de análisis comienza en la raíz y luego continúa hacia las hojas.
Dos tipos de análisis de arriba hacia abajo son:
- Análisis predictivo:
El análisis predictivo puede predecir qué producción se debe utilizar para reemplazar la cadena de entrada específica. El analizador predictivo utiliza un punto de anticipación, que apunta hacia los siguientes símbolos de entrada. Retroceder no es un problema con esta técnica de análisis. Se le conoce como analizador LL(1).
- Análisis de descenso recursivo:
Esta técnica de análisis analiza recursivamente la entrada para crear un árbol de oración. Consta de varias funciones pequeñas, una para cada no terminal de la gramática.
Análisis de abajo hacia arriba
En el análisis ascendente en el diseño del compilador, la construcción del árbol de análisis comienza con la hoja y luego se procesa hacia su raíz. También se denomina análisis de reducción de desplazamiento. Este tipo de análisis en el diseño del compilador se crea con la ayuda del uso de algunos herramientas de software.
Error: métodos de recuperación
Errores comunes que ocurren al analizar el software del sistema
- Léxico: Nombre de un identificador escrito incorrectamente
- Sintáctico: paréntesis desequilibrado o falta un punto y coma
- Semántico: asignación de valor incompatible
- lógico: Bucle infinito y código no accesible
Un analizador sintáctico debe poder detectar e informar cualquier error que se encuentre en el programa. Por lo tanto, siempre que se produzca un error, el analizador debe poder gestionarlo y continuar analizando la entrada restante. Un programa puede tener los siguientes tipos de errores en varias etapas del proceso de compilación. Hay cinco métodos comunes de recuperación de errores que se pueden implementar en el analizador sintáctico
Recuperación en modo declaración
- En el caso de que el analizador encuentre un error, le ayudará a tomar medidas correctivas. Esto permite que el resto de entradas y estados se analicen con antelación.
- Por ejemplo, agregar un punto y coma faltante viene en el método de recuperación del modo declaración. Sin embargo, el diseñador de análisis debe tener cuidado al realizar estos cambios, ya que una corrección incorrecta puede generar un bucle infinito.
Recuperación en modo pánico
- En caso de que el analizador detecte un error, este modo ignora el resto de la declaración y no procesa la entrada errónea hasta el delimitador, como un punto y coma. Este es un método simple de recuperación de errores.
- En este tipo de método de recuperación, el analizador rechaza los símbolos de entrada uno por uno hasta que se encuentra un único grupo designado de tokens de sincronización. Los tokens de sincronización generalmente utilizan delimitadores como o.
Recuperación a nivel de frase
- El compilador corrige el programa insertando o eliminando tokens. Esto le permite proceder al análisis desde donde estaba. Realiza corrección en la entrada restante. Puede reemplazar un prefijo de la entrada restante con alguna cadena, lo que ayuda al analizador a continuar el proceso.
Producciones de errores
- La recuperación de errores de producción amplía la gramática del lenguaje que genera las construcciones erróneas. A continuación, el analizador realiza un diagnóstico de errores sobre esa construcción.
Corrección Global
- El compilador debe realizar la menor cantidad de cambios posible mientras procesa una cadena de entrada incorrecta. Dada la cadena de entrada a y la gramática c incorrectas, los algoritmos buscarán un árbol de análisis para una cadena relacionada b. Al igual que algunas inserciones, eliminaciones y modificaciones realizadas con tokens, se necesita transformar an en b en la menor cantidad posible.
Gramática
Una gramática es un conjunto de reglas estructurales que describen una lengua. Las gramáticas asignan estructura a cualquier oración. Este término también se refiere al estudio de estas reglas, y este archivo incluye morfología, fonología y sintaxis. Es capaz de describir muchos, de la sintaxis de lenguajes de programación.
Reglas de gramática formal
- El símbolo no terminal debe aparecer a la izquierda de al menos una producción
- El símbolo de objetivo nunca debe mostrarse a la derecha de::= de ninguna producción.
- Una regla es recursiva si LHS aparece en su RHS
Convenciones de notación
Convenciones de notación El símbolo puede indicarse encerrando el elemento entre corchetes. Es una secuencia arbitraria de instancias del elemento que puede indicarse encerrando el elemento entre llaves seguidas de un símbolo de asterisco, { … }*.
Es una elección de la alternativa que puede utilizar el símbolo dentro de la regla única. Puede estar entre paréntesis ([,]) cuando sea necesario.
Dos tipos de convenciones de notación: terminales y no terminales.
1.Terminales:
- Letras minúsculas del alfabeto como a, b, c,
- Operasímbolos tor como +,-, *, etc.
- Símbolos de puntuación como paréntesis, almohadilla y coma.
- 0, 1,…, 9 dígitos
- Cadenas en negrita como id o if, cualquier cosa que represente un símbolo de terminal único
2.No terminales:
- Letras mayúsculas como A, B, C
- Nombres en minúscula y cursiva: la expresión o alguna
Gramática libre de contexto
Una CFG es una gramática recursiva por la izquierda que tiene al menos una producción del tipo. Las reglas en una gramática libre de contexto son principalmente recursivas. Un analizador de sintaxis comprueba si un programa específico cumple o no todas las reglas de la gramática libre de contexto. Si se cumple, estos analizadores de sintaxis de reglas pueden crear un árbol de análisis para ese programa.
expression -> expression -+ term expression -> expression – term expression-> term term -> term * factor term -> expression/ factor term -> factor factor factor -> ( expression ) factor -> id
Derivación de gramática
La derivación gramatical es una secuencia de reglas gramaticales que transforma el símbolo inicial en una cadena. Una derivación prueba que la cadena pertenece al lenguaje de la gramática.
Derivación más a la izquierda
Cuando la forma oracional de entrada se escanea y reemplaza en secuencia de izquierda a derecha, se conoce como derivación más a la izquierda. La forma oracional que se deriva de la derivación más a la izquierda se llama forma oracional por la izquierda.
Derivación más a la derecha
Escanee la derivación más a la derecha y reemplace la entrada con reglas de producción, secuencia de derecha a izquierda. Se conoce como derivación más a la derecha. La forma oracional que se deriva de la derivación más a la derecha se conoce como forma oracional derecha.
Analizador de sintaxis versus analizador léxico
Analizador de sintaxis | Analizador léxico |
---|---|
El analizador de sintaxis se ocupa principalmente de construcciones recursivas del lenguaje. | El analizador léxico facilita la tarea del analizador de sintaxis. |
El analizador de sintaxis trabaja con tokens en un programa fuente para reconocer estructuras significativas en el lenguaje de programación. | El analizador léxico reconoce el token en un programa fuente. |
Recibe entradas, en forma de tokens, de analizadores léxicos. | Es responsable de la validez de un token suministrado por
el analizador de sintaxis |
Desventajas de utilizar analizadores de sintaxis
- Nunca determinará si un token es válido o no.
- No le ayuda a determinar si una operación realizada en un tipo de token es válida o no
- No puede decidir que el token se declare e inicialice antes de usarlo
Resumen
- El análisis de sintaxis es una segunda fase del proceso de diseño del compilador que viene después del análisis léxico.
- El analizador sintáctico te ayuda a aplicar reglas al código.
- Oración, lexema, token, palabras clave y palabras reservadas, palabras irrelevantes, comentarios, delimitadores, conjunto de caracteres e identificadores son algunos términos importantes utilizados en el análisis de sintaxis en la construcción del compilador.
- Parse comprueba que la cadena de entrada esté bien formada y, si no, la rechaza
- Las técnicas de análisis se dividen en dos grupos diferentes: análisis de arriba hacia abajo y análisis de abajo hacia arriba.
- Léxico, sintáctico, semántico y lógico son algunos errores comunes que ocurren durante el método de análisis.
- Una gramática es un conjunto de reglas estructurales que describen una lengua.
- Las convenciones de notación pueden indicar el símbolo encerrando el elemento entre corchetes.
- Un CFG es una gramática recursiva por la izquierda que tiene al menos una producción del tipo
- La derivación gramatical es una secuencia de reglas gramaticales que transforma el símbolo inicial en una cadena.
- El analizador de sintaxis se ocupa principalmente de construcciones recursivas del lenguaje, mientras que el analizador léxico facilita la tarea del analizador de sintaxis en DBMS
- El inconveniente del método del analizador de sintaxis es que nunca determinará si un token es válido o no.