Tabla de contenidos
Para que el código fuente se convierta en un programa, debe convertirse en un formato ejecutable utilizando un compilador, por ejemplo. La mayoría de las veces, sin embargo, el compilador no puede comprender directamente lo que hay en el código fuente.
Muchos lenguajes de programación, especialmente los lenguajes modernos de alto nivel, están diseñados de tal manera que resultan cómodos y claros para los programadores. Por ejemplo, el compilador no utiliza comentarios o símbolos invisibles como espacios. Sobre todo, necesita información como las palabras clave, valores u operadores utilizados. También necesitas saber cómo se relacionan.
Por lo tanto, la información del texto fuente debe analizarse, prepararse y estructurarse de acuerdo con un esquema determinado para que el compilador la pueda utilizar. Un analizador se encarga de esta tarea. Siempre que la entrada siga una gramática libre de contexto, se puede analizar y procesar automáticamente con el analizador apropiado.
Los Lexers hacen el trabajo preparatorio para los analizadores sintácticos
Por lo tanto, un analizador puede analizar la entrada y utilizarla para crear una representación jerárquica de la información que se requiere para su procesamiento posterior. Para ello, la información leída debe desglosarse en los componentes más pequeños posibles, que sean posibles de acuerdo con las reglas de la gramática respectiva. También analiza cómo estos componentes se relacionan lógicamente entre sí.
El desmantelamiento se realiza internamente mediante un escáner léxico (abreviado: Lexer, también tokenizador). Los Lexers pueden reconocer cadenas que pertenecen juntas dentro de una entrada y devolverlas como tokens. Los tokens son componentes relacionados lógicamente, que consisten en un terminal gramatical (por ejemplo, tipo) y el no terminal asignado (por ejemplo, valor).
Como un pequeño ejemplo para una mejor comprensión: La expresión 4 + 7 consta de los tokens “número 4”, “ operador +” y “número 7”. El analizador recibe la información, que ha sido preparada de esta manera, token por token, y la convierte gradualmente en la representación requerida para su posterior procesamiento.
Las entradas se convierten en información estructurada
El analizador realiza un análisis sintáctico sobre el resultado del análisis léxico. Se utiliza para llevar la información a una estructura jerárquica. Como regla general, la jerarquía se representa con un árbol de sintaxis (árbol de análisis). El árbol de sintaxis divide la entrada en expresiones cada vez más finas hasta que todo se divide en tokens individuales.
Los nodos internos son símbolos no terminales (por ejemplo, expresiones que no se han descompuesto completamente, llamadas a funciones), las hojas corresponden a símbolos terminales de la gramática (tokens). La expresión simple 4 + 7 podría dividirse directamente en tres hojas igualmente clasificadas «Número 4», «Operador +» y «Número 7», la expresión 4+ (3 + 4) se dividiría primero en la hoja «Número 4″ ”Y el Nodo interno» Expresión (3 + 4) «derivado y luego desglosado.
Diferentes tipos de analizadores
Se hace una distinción entre diferentes tipos de analizadores, incluidos sobre todo analizadores de arriba hacia abajo y analizadores de abajo hacia arriba. La principal diferencia entre estos dos tipos es que tienen diferentes puntos de inicio y finalización para la estructura del árbol de sintaxis.
Analizadores de arriba hacia abajo: los analizadores de arriba hacia abajo (por ejemplo, analizadores de LL y LF) funcionan derivando del símbolo de inicio a los tokens individuales: el análisis se ejecuta desde todo el texto fuente hasta las funciones y expresiones que contiene y finalmente a los tokens que contiene.
Analizador de abajo hacia arriba: con el analizador de abajo hacia arriba (por ejemplo, diferentes analizadores LR), el procesamiento comienza con un token, es decir, una hoja del árbol. Se abre camino hacia contextos más amplios, como expresiones y funciones, reduciendo tokens individuales hasta que alcanza el símbolo de inicio. Con el analizador de abajo hacia arriba, el símbolo de inicio indica que la entrada ha sido completamente analizada.
Generador de analizador
Con un generador de analizadores sintácticos es posible crear automáticamente un analizador sintáctico eficiente para un sistema léxico dado. También hay generadores de escáner que generan un escáner léxico a partir de una descripción formal. Estas herramientas se utilizan, por ejemplo, en la construcción de compiladores; los generadores de compiladores completos son todavía experimentales.
Los analizadores requieren una entrada correctamente estructurada
Un analizador generalmente se basa en las entradas que cumplen con una determinada sintaxis. Por ejemplo, las instrucciones deben seguir un formato estandarizado para que un analizador las reconozca correctamente.
XML, por ejemplo, es un lenguaje de marcado ampliamente utilizado que se puede utilizar para estructurar información jerárquicamente. El formato puede ser leído directamente por humanos y por máquinas usando un analizador XML. Sin embargo, el analizador XML solo funciona si la estructura no tiene errores.
Si primero apareciera un carácter inesperado, en casos extremos el análisis sintáctico de todo el documento podría fallar. La mayoría de los analizadores informan cuando encuentran una sintaxis incorrecta. Esto no solo ayuda a solucionar problemas, sino que también ayuda a evitar muchos errores durante el desarrollo.