2. COMPILADOR SENCILLO DE UNA PASADA Examina el código fuente una vez, generando el código o programa objeto.
3.
4. Los espacios en blanco que separan los caracteres de estos componentes léxicos normalmente se eliminan durante el análisis léxico. La fase de análisis léxico lee los caracteres en el programa fuente y los agrupa en una cadena de componentes léxico en los que cada componente representa una secuencia lógicamente coherente de caracteres, como un identificador, una palabra clave (if, While, etc), un carácter de puntuación, o un operador de varios caracteres, como := . La secuencia de caracteres que forma un componente léxico se denomina l exema del componente A ciertos componentes léxicos se les agregara un “valor léxico”. Así, cuando se encuentra un identificador como velocidad, el analizador léxico no solo genera un componente léxico, por ejemplo: id, sino que también introduce el lexema velocidad en la tabla de símbolos, si aun no estaba allí. El valor léxico asociado con esta aparición de id señala la entrada de la tabla de símbolos correspondiente a velocidad.
5. En esta sección, se usaran id 1 , id 2 e id 3 , para posición, inicial y velocidad, respectivamente, para enfatizar que la representación interna de un identificador es diferente de la secuencia de caracteres que forman el identificador. Por tanto, la representación Posición:= inicial + velocidad * 60 después del análisis léxico queda sugerida por: id 1 := id 2 + id 3 * 60 Se deberían construir componentes léxicos para el operador de varios caracteres := y el numero 60, para reflejar su representación interna. En id 1 := id 2 + id 3 * 60 ya se introdujeron las fases segunda y tercera: los análisis sintáctico y semántico.
6. El análisis sintáctico impone una estructura jerárquica a la cadena de componentes léxicos, que se representara por medio de arboles sintácticos así: Id 1 Id 2 Id 3 60 := + * a)
7. Una estructura de datos típica para el árbol sería la siguiente: := + * 1 Id 2 Id 3 Id 60 num
8. En la que un nodo interior es un registro con un campo para el operador y dos campos que contienen apuntadores a los registros de los hijos izquierdo y derecho. Una hoja es un registro con dos o mas campos, una para identificar el componente léxico de la hoja, y los otros para registrar información sobre el componente léxico. Se puede tener información adicional sobre las construcciones del lenguaje añadiendo mas campos a los registros de los nodos.
9. ANALISIS SINTACTICO También llamado análisis jerárquico. Este implica agrupar los componentes léxicos del programa fuente en frases gramaticales que el compilador utiliza para sintetizar la salida. Por lo general las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico como el de la siguiente figura:
10. Proposición de asignación Expresión Expresión Expresión Expresión Identificador Identificador Posición Inicial Velocidad 60 := + * Expresión Identificador Numero
11.
12. Las reglas a) y b) son reglas básicas, mientras que la regla c) define expresiones en función de operadores aplicados a otras expresiones. Así, por la regla a), inicial y velocidad son expresiones. Por la regla b), 60 es una expresión, mientras que por la regla c), primero podemos inferir que velocidad * 60 es una expresión, y finalmente, que inicial + velocidad * 60 también es una expresión. De manera similar, muchos lenguajes definen recursivamente las proposiciones mediante reglas como: Si Identificador 1 es un identificador y Expresion 1 es una expresión, entonces… Identificador 1 := Expresion 2 es una proposición Si Expresion 1 es una expresión y Proposicion 2 es una proposición, entonces… While ( expresión 1 ) do proposicion 2 If ( expresión 1 ) then proposicion 2 son proposiciones.
13. La división entre análisis léxico y análisis sintáctico es algo arbitraria. Generalmente se elige una división que simplifique la tarea completa del análisis. Un factor para determinar la división es si una construcción del lenguaje fuente es inherentemente recursiva o no. Las construcciones léxicas no requieren recursión, mientras que las construcciones sintácticas suelen requerirla. Las gramáticas independientes del contexto son una formalización de reglas recursivas que se pueden usar para guiar el análisis sintáctico.
14. Por ejemplo, no se requiere recursión para reconocer los identificadores, que suelen ser cadenas de letras y dígitos que comienzan con una letra. Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carácter que no sea ni letra ni digito, y agrupando después todas las letras y dígitos encontrados hasta ese punto en un componente léxico identificador. Los caracteres asi agrupados se registran en una tabla, llamada tabla de símbolos, y se retiran de la entrada, para que pueda empezar el procesamiento del siguiente elemento léxico.
15. Por otra parte, esta clase de análisis léxico lineal no es suficientemente poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los paréntesis de las expresiones, o las palabras begin y end en proposiciones sin imponer alguna clase de estructura jerárquica o de anidamiento a la entrada.
16. El árbol de análisis sintáctico de la figura anterior describe la estructura sintáctica de la entrada. Una representación interna más común de esta estructura es la que da el árbol sintáctico de la figura a) Posición Inicial Velocidad 60 := + * a) Entareal Posición Inicial Velocidad 60 := + *
17. TABLA DE SIMBOLOS Un compilador necesita guardar y usar la información de los objetos que se va encontrando en el texto fuente, como variables, etiquetas, declaraciones de tipos, etc. Esta información se almacena en una estructura de datos interna conocida como tabla de símbolos. El compilador debe desarrollar una serie de funciones relativas a la manipulación de esta tabla como insertar un nuevo elemento en ella, consultar la información relacionada con un símbolo, borrar un elemento, etc. Como se tiene que acceder mucho a la tabla de símbolos los accesos deben ser lo más rápidos posible para que la compilación sea eficiente.
18. GRAMATICA TIPO CERO Una cadena de componentes léxicos es una secuencia de cero o más componentes léxicos. Si la cadena posee cero componentes entonces se dice que es una cadena vacía y se escribe ε.