¿Qué es el análisis de sintaxis?
El análisis de sintaxis es una segunda fase del proceso de diseño del compilador en el que se comprueba 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 proceso de análisis de sintaxis en el diseño del compilador viene después de la fase de análisis léxico. También se conoce como árbol de análisis o árbol de sintaxis. El árbol de análisis se desarrolla con la ayuda de una gramática predefinida del idioma. El analizador de sintaxis también comprueba si un programa dado cumple las reglas implícitas en una gramática libre de contexto. Si satisface, el analizador crea el árbol de análisis de ese programa fuente. De lo contrario, mostrará mensajes de error.
En este tutorial, aprenderá
- ¿Por qué necesita Syntax Analyzer?
- Terminología importante del analizador de sintaxis
- ¿Por qué necesitamos el análisis?
- Técnicas de análisis
- Error: métodos de recuperación
- Gramática:
- Convenciones de notación
- Gramática libre de contexto
- Derivación gramatical
- Sintaxis vs analizador léxico
- Desventajas de usar analizadores de sintaxis
¿Por qué necesita Syntax Analyzer?
- Comprueba si el código es válido gramaticalmente.
- El analizador sintáctico le ayuda a aplicar reglas al código.
- Le ayuda a asegurarse de que cada riostra 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:
- Oración: una oración es un grupo de caracteres sobre un 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 usar como nombre o identificador de variable.
- Palabras irrelevantes: 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 el final de alguna unidad sintáctica. Como una declaración o expresión, "comenzar" ... "finalizar" o {}.
- Juego de caracteres : ASCII, Unicode
- Identificadores : es una restricción en la longitud que le ayuda a reducir la legibilidad de la oración.
- Los símbolos de operador - + y - realizan dos operaciones aritméticas básicas.
- Elementos sintácticos del lenguaje
¿Por qué necesitamos el 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 ocurrió 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 sintáctico de arriba hacia abajo, la construcción del árbol de análisis sintáctico comienza en la raíz y luego avanza 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 usar 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. El retroceso no es un problema con esta técnica de análisis. Se conoce como analizador LL (1)
- Análisis de descenso recursivo:
Esta técnica de análisis analiza de forma recursiva la entrada para crear un árbol de prase. 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 de abajo hacia arriba en el diseño del compilador, la construcción del árbol de análisis comienza con la licencia y luego se procesa hacia su raíz. También se denomina análisis sintáctico por desplazamiento-reducción. Este tipo de análisis sintáctico en el diseño del compilador se crea con la ayuda de algunas herramientas de software.
Error: métodos de recuperación
Errores comunes que ocurren al analizar en el software del sistema
- Léxico : nombre de un identificador escrito incorrectamente
- Sintáctico : paréntesis desequilibrado o falta un punto y coma
- Semántica : asignación de valor incompatible
- Lógico : bucle infinito y código no accesible
Un analizador debería poder detectar e informar cualquier error encontrado en el programa. Entonces, cada vez que ocurre un error, el analizador. Debería poder manejarlo y seguir 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
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 adelante.
- Por ejemplo, agregar un punto y coma que falta viene en el método de recuperación en 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 conducir a un bucle infinito.
Recuperación en modo de pánico
- En el caso de que el analizador encuentre un error, este modo ignora el resto de la declaración y no procesa la entrada de la entrada errónea al 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 solo grupo designado de tokens de sincronización. Los tokens de sincronización generalmente usan delimitadores como o.
Recuperación a nivel de frase:
- El compilador corrige el programa insertando o eliminando tokens. Esto le permite proceder a analizar desde donde estaba. Realiza la 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 error
- La recuperación de la producción de errores expande 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 debería realizar el menor número posible de cambios mientras procesa una cadena de entrada incorrecta. Dada una cadena de entrada incorrecta a y una gramática c, los algoritmos buscarán un árbol de análisis para una cadena relacionada b. Al igual que algunas inserciones, eliminaciones y modificaciones hechas de tokens necesarios para transformar an en b, es lo mínimo posible.
Gramática:
Una gramática es un conjunto de reglas estructurales que describen un idioma. 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 muchas de las sintaxis de los lenguajes de programación.
Reglas de la gramática de las formas
- El símbolo de no terminal debe aparecer a la izquierda de al menos una producción
- El símbolo de gol 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
El símbolo de las convenciones de notación se puede indicar encerrando el elemento entre corchetes. Es una secuencia arbitraria de instancias del elemento que se puede indicar encerrando el elemento entre llaves seguido de un símbolo de asterisco, {…} *.
Es una elección de la alternativa que puede usar el símbolo dentro de la regla única. Puede ir entre paréntesis ([,]) cuando sea necesario.
Dos tipos de zona de convenciones de notación Terminal y no terminales
1.Terminales:
- Letras minúsculas en el alfabeto como a, b, c,
- Símbolos de operador como +, -, *, etc.
- Símbolos de puntuación como paréntesis, almohadilla, coma
- 0, 1,…, 9 dígitos
- Cadenas en negrita como id o if, cualquier cosa que represente un solo símbolo de terminal
2.No terminales:
- Letras mayúsculas como A, B, C
- Nombres en cursiva minúscula: la expresión o algunos
Gramática libre de contexto
Un CFG es una gramática recursiva a 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 verifica que un programa específico satisfaga o no todas las reglas de la gramática libre de contexto. Si cumple, estos analizadores de sintaxis de reglas pueden crear un árbol de análisis para ese programa.
expression -> expression -+ termexpression -> expression - termexpression-> termterm -> term * factorterm -> expression/ factorterm -> factor factorfactor -> ( expression )factor -> id
Derivación gramatical
La derivación gramatical es una secuencia de reglas gramaticales que transforma el símbolo de inicio 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 se escanea la forma oracional de entrada y se 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 a la izquierda.
Derivación más a la derecha
Derivación más a la derecha escanea y reemplaza la entrada con reglas de producción, de derecha a izquierda, secuencia. Se conoce como derivación más a la derecha. La forma de oración que se deriva de la derivación más a la derecha se conoce como forma de oración a la derecha.
Sintaxis vs 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 proporcionado por el analizador de sintaxis |
Desventajas de usar 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 declara e inicializa antes de que se use
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 le ayuda a aplicar reglas al código.
- Oración, Lexeme, Token, Palabras clave y palabras reservadas, Palabras irrelevantes, Comentarios, Delimitadores, Conjunto de caracteres, 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, 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 un idioma.
- El símbolo de las convenciones de notación se puede indicar encerrando el elemento entre corchetes.
- Un CFG es una gramática recursiva a 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 de inicio 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