Beruflich Dokumente
Kultur Dokumente
Bibliografa:
Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, t cnicas y herramientas, Tema 4, p ginas: 186-200. e a Louden, K.C. (1997), Compiler Construction: Principles and Practice, Tema 4, p ginas: 143-193. a Vivancos, E. (2000), Compiladores I: una introducci on a la fase de an lisis, Tema 3, p ginas: 23-48. Especialmente para ejercicios. a a
Contenido: 1 An lisis descendente: el aut mata predice/concuerda. a o 2 Problemas en el an lisis descendente: Recursividad a izquierdas y su a eliminaci n. Indeterminismo en las alternativas. o 3 Gram ticas LL(1): Los conjuntos de PRIMEROS y SIGUIENTES. a La condici n LL(1). o 4 Analizador sint ctico predictivo recursivo. a 5 Analizador sint ctico predictivo dirigido por tabla. a 6 Recuperaci n de errores en los analizadores descendentes: Los cono juntos de predicci n y sincronizaci n. Recuperaci n en modo de o o o p nico. a
78
4.1 ANALISIS DESCENDENTE: EL AUTOMATA PREDICE/CONCUERDA Especicaci n de la sintaxis de un lenguaje mediante gram ticas indepeno a dientes del contexto (GIC). Estas gram ticas permiten recursividad y esa e tructuras anidadas. Por ejemplo: sentencias if-else anidadas, par ntesis anidados en expresiones aritm ticas, que no pueden ser representadas mee diante expresiones regulares. La recursividad va a implicar:
Algoritmos de reconocimiento m s complejos, que hagan uso de llaa madas recursivas o usen explcitamente una pila, la pila de an lisis a sint ctico. a La estructura de datos usada para representar la sintaxis del lenguaje ha de ser tambi n recursiva (el arbol de an lisis sint ctico), en vez de e a a lineal (caso de un vector de caracteres para almacenar los lexemas en el analizador l xico). e
Fundamento de los m todos descendentes: aut mata predice/concuerda e o En cada paso del proceso de derivacion de la cadena de entrada se realiza una predicci n de la posible producci n a aplicar y se comprueba si o o existe una concordancia entre el smbolo actual en la entrada con el primer terminal que se puede generar a partir de esa regla de produccion, si existe esta concordancia se avanza en la entrada y en el arbol de derivaci n, en cao so contrario se vuelve hacia atr s y se elige una nueva regla de derivaci n. a o
79
Ejemplo Supongamos la siguiente gram tica que permite generar exprea siones aritm ticas: e
E E T T F T E + T E - T E F T * F T / F T ( E ) num id
Para la entrada num + id * num. Crear el arbol de an lisis sint ctico... a a Nos restringimos al caso de m todos deterministas (no hay vuelta atr s) tee a niendo en cuenta un s lo smbolo de prean lisis (componente l xico que se o a e est analizando en la cadena de entrada en ese momento), sabemos exactaa mente en todo momento que producci n aplicar. El smbolo de prean lisis o a se actualiza cada vez que se produce una concordancia. Los m todos descendentes se caracterizan porque analizan la cadena de e componentes l xicos de izquierda a derecha, obtienen la derivaci n m s a e o a la izquierda y el arbol de derivaci n se construye desde la raz hasta las o hojas. Problemas de decisi n: Qu producci n elegir cuando hay varias o e o alternativas?
Conjunto PRIMEROS(): el conjunto de tokens que pueden comenzar cualquier frase derivable de , . Conjunto SIGUIENTES( ): el conjunto de tokens que pueden aparecer despu s de un no-terminal , e
80
4.2 PROBLEMAS EN EL ANALISIS DESCENDENTE: La recursividad a izquierdas da lugar a un bucle innito de recursion.
Problemas de indeterminismo cuando varias alternativas en una misma producci n comparten el mismo prejo. No sabramos cu l elegir. o a Probaramos una y si se produce un error haramos backtracking. Si queremos que el m todo sea determinista hay que evitarlas. e
Existen transformaciones de gram ticas para su la eliminaci n. Estas transa o formaciones no modican el lenguaje que se est reconociendo, pero si que a cambian el aspecto de la gram tica, que es en general menos intuitiva. a
4.2.1
Una gram tica es recursiva por la izquierda si tiene un no-terminal a . que existe una producci n o Algoritmo para eliminar recursividad a izquierdas:
en la forma:
por:
81
Una gram tica recursiva a izquierdas nunca puede ser LL(1). En efecto, a asume que encontramos un token t, tal que predecimos la produccion , despu s de la prediccion, al apilar la parte derecha de la producci n, e o a a el smbolo estar en la cima de de la pila, y por tanto, se predecir la misma producci n, y tendiramos de nuevo en la cima, as hasta que el o innito, produciendose un desbordamiento de la pila de an lisis sint ctico. a a
4.2.2 Indeterminismo en las alternativas. Factorizaci n o Cuando dos alternativas para un no-terminal empiezan igual, no se sabe qu alternativa expandir. Por ejemplo: e
Stmt if E then Stmt else Stmt if E then Stmt otras
Si en la entrada tenemos el token if no se sabe cual de las dos alternativas o elegir para expandir . La idea es reescribir la producci n para retrasar la decisi n hasta haber visto de la entrada lo suciente para poder elegir la o opci n correcta. o
Stmt Stmt if E then Stmt Stmt otras else Stmt
segundo paso: Si , sustituir todas las producciones de , de la , donde representa todas las alterforma nativas de que no comienzan con por:
82
A A
...
4.3 GRAMATICAS LL(1) Las gram ticas LL(1) permiten construir de forma autom tica un anala a izador determinista descendente con tan s lo examinar en cada momeno to el smbolo actual de la cadena de entrada (smbolo de prean lisis) para a saber que producci n aplicar. o
L: m todo direccional, procesamos la entrada de izquierda a derecha e (from left to rigth). L: obtenemos derivaci n m s a la izquierda (left-most derivation). o a 1: usamos un smbolo de prean lisis para decidir la producci n a a o aplicar.
Teorema 1: Una gram tica LL(1) no puede ser recursiva a izquiera das y debe estar factorizada. Teorema 2: Una gram tica LL(1) es no ambigua. a Las armaciones inversas no tienen porque ser ciertas. Ejemplo de gram tica LL(1). a
S B aB b aBb
83
4.3.1 C mo garantizar que una gram tica es LL(1): los conjuntos o a PRIMEROS y SIGUIENTES? Sea , PRIMEROS() indica el conjunto de terminales que pueden aparecer al principio de cadenas derivadas de . Si
entonces
PRIMEROS() con
Si entonces
PRIMEROS()
Sea entonces SIGUIENTES(A) indica el conjunto de terminales que en cualquier momento de la derivaci n pueden aparecer inmediatao mente a la derecha (despu s de) . e SIGUIENTES(A) si existe tales Sea , que . Algoritmo para calcular el conjunto de PRIMEROS: Para X un unico smbolo de la gram tica (terminal o no-terminal). En a tonces PRIMEROS(X) consiste de smbolos terminales y se calcula:
Si X es un terminal o , entonces PRIMEROS(X)= X Si X es un no-terminal, entonces para cada producci n de la forma o , PRIMEROS(X) contiene a PRIMEROS( . Si adem s para alg n todos los conjuntos PRIMEROS( ) a u . . . PRIMEROS( ) contienen a , entonces PRIMEROS(X) contiene a PRIMEROS( .
Para cualquier cadena, , de terminales y no-terminales, entonces PRIMEROS() contiene a u , si PRIMEROS( ) conPRIMEROS( . Para alg n , entonces PRIMEROS() contiene para todos los , tiene a PRIMEROS( . Finalmente, si para todo PRIMEROS( ) contiene , entonces PRIMEROS() contiene a .
84
, entonces SIGUIENTES(A) consiste de terminales y Dado del smbolo (smbolo de n de cadena) y se calcula como: Si
es el smbolo de inicio, entonces
SIGUIENTES(A)
, entonces o
PRIMEROS(E)= (,id,num PRIMEROS(T)= (,id,num PRIMEROS(F)= (,id,num PRIMEROS(E)= +,-, PRIMEROS(T)= *, /, SIGUIENTES(E)= #,) SIGUIENTES(E)= #,) SIGUIENTES(T)= #,),+,SIGUIENTES(T)= #,),+,SIGUIENTES(F)= +,-,*,/,),#
85
4.3.2
La condici n LL(1) o
Para que una gram tica sea LL(1) se debe cumplir que: a 1 Para las producciones de la forma que:
se debe cumplir
para todo i,j ( ).
, tal que
PRIMEROS(A), entonces:
Esta condici n garantiza que para aquellos smbolos que pueden derivar o la cadena vaca, el primer smbolo que generan y el siguiente que puede aparecer detr s de ellos sean distintos, sino no sabramos c mo a o decidir si vamos a empezar a reconocer el no-terminal o que ya lo hemos reconocido. Comprobar que la gram tica anterior para generar expresiones aritm ticas a e es LL(1).
86
4.4
En este m todo se considera a cada regla de la gram tica como la denici n e a o de un procedimiento que reconocer al no-terminal de la parte izquierda. a El lado derecho de la producci n especica la estructura del c digo para o o ese procedimiento: los terminales corresponden a concordancias con la entrada, los no-terminales con llamadas a procedimientos y las alternativas a casos condicionales en funcion de lo que se est observando en la entrada. e Se asume que hay una variable global que almacena el componente l xico e actual (el smbolos de prean lisis), y en el caso en que se produce una a concordancia se avanza en la entrada, o en caso contrario se declara un error. Implementaci n de un analizador sint ctico recursivo Consta de: o a
Un procedimiento, que llamaremos Parea/Match que recibe como entrada un terminal y comprueba si el smbolo de prean lisis coincide a con ese terminal. Si coinciden se avanza en la entrada, en caso contrario se declara un error sint ctico (lo que esperamos en la gram tica a a no coincide con la entrada).
Procedimiento Parea(terminal) inicio si preanalisis == terminal entonces preanalisis=siguiente token sino error sintctico a fin
87
Para las reglas de la forma , decidir la producci n a utilizar en funci n de los conjuntos PRIMEROS( ). o o
Procedimiento A() inicio segn preanalisis est en: u a PRIMEROS( ): PRIMEROS( ): ... PRIMEROS( ): fin segn u si preanlisis no pertenece a ningn PRIMEROS( ) a u entonces error sintctico, excepto si existe la a alternativa fin proceder segn alternativa u proceder segn alternativa u proceder segn alternativa u
Para cada alternativa del no-terminal, proceder analizando secuencialmente cada uno de los smbolos que aparece en la parte derecha terminales y no-terminales.
Si es un no-terminal haremos una llamada a su procedimiento ; Si es un terminal haremos una llamada al procedimiento Parea con ese terminal como parmetro. a
Para lanzar el analizador sint ctico se hace una llamada al proceda imiento que corresponde con el smbolo de inicio en la gram tica, el a axioma. Cuidado, no olvidar hacer una llamada previa al analizador l xico para inicializar el smbolo de prean lisis (variable global) con e a el primer token del chero de entrada!.
88
Expresion()
segn preanlisis est en: u a a TKN MAS : Parea(TKN MAS); Termino(); Expresion Prima(); TKN MENOS : Parea(TKN MENOS); Termino(); Expresion Prima(); si no est en ninguno de los anteriores entonces no hacer nada a fin segn u
Procedimiento Termino()
89
segn preanlisis est en: u a a TKN POR : Parea(TKN POR); Factor(); Termino Prima(); TKN DIV : Parea(TKN DIV); Factor(); Termino Prima(); si no est en ninguno de los anteriores entonces no hacer nada a fin segn u
Procedimiento Factor()
segn preanlisis est en: u a a TKN ABREPAR : Parea(TKN ABREPAR); Expresion(); Parea(TKN CIERRAPAR); TKN NUM : TKN ID : Parea(TKN NUM); Parea(TKN ID);
90
* num #
Ejemplo 2: Constuir un analizar predictivo recursivo para la siguiente gram tica que genera una declaraci n de tipos en Pascal a o
Tipo Simple id array [ Simple] of Tipo Simple integer char num puntopunto num
91
4.5 ANALIZADOR SINTACTICO PREDICTIVO DIRIGIDO POR TABLA Se puede construir un analizador sint ctico descendente predictivo noa recursivo sin llamadas recursivas a procedimientos, sino que se utiliza una pila auxiliar de smbolos terminales y no-terminales. Para determi nar qu producci n debe aplicarse en cada momento se busca en una tabla e o de an lisis sint ctico (parsing table) en funci n del smbolo de prean lisis a a o a que se est observando en ese momento y del smbolo en la cima de la pila a se decide la acci n a realizar. o Esquema de un analizador sint ctico descendente dirigido por tabla a
Secuencia de tokens de entrada id Pila de anal. sintac. * id + num #
preanlisis
Salida
Buffer de entrada: que contiene la cadena de componentes l xicos e que se va a analizar seguida del smbolo de n de cadena. La pila de an lisis sint ctico: que contiene una secuencia de smbolos a a de la gram tica con el smbolo en la parte de abajo que indica la a base de la pila.
92
Una tabla de an lisis sint ctico: que es una matriz bidimensional a a con y . La tabla de an lisis sint ctico a a dirige el an lisis y es lo unico que cambia de una analizador a otro (de a una gram tica a otra). a Salida: la serie de producciones utilizadas en el an lisis de la secuena cia de entrada.
El analizador sint ctico tiene en cuenta en cada momento, el smbolo de a la cima de la pila y el smbolo en curso de la cadena de entrada (el smbolo de prean lisis). Estos dos smbolos determinan la acci n a re a o alizar, que pueden ser:
Si , el an lisis sint ctico ha llegado al nal y la cadena a a ha sido reconocida con exito. Si , el terminal se desapila (se ha reconocido ese terminal) y se avanza en la entrada obteniendo el siguiente componente l xico. e Si es no-terminal, entonces se consulta en la tabla . La tabla contiene una producci n a aplicar o si est vaca signica un o a error. Si es una producci n de la forma o , entonces se meten los smbolos en la pila (notar el orden inverso). Si es un error el analizador llama a una rutina de error.
93
una indicacin de error o M todo: e Como configuracin inicial se tiene en el fondo de la pila el smbolo o el axioma en la cima y la cadena en el buffer de entrada. ,
Iniciar preanlisis con el primer smbolo de . a repetir Sea si el smbolo de la cima de la pila es un terminal o si entonces
entonces
extraer de la pila y obtener nuevo componente lxico e
extraer meter
entonces
de la pila con
en la cima de la pila
sino error(); hasta que (* la pila est vaca y hemos procesado toda la entrada*) a
El an lisis sint ctico dirigido por tabla es m s eciente en cuanto a tiema a a po de ejecuci n y espacio, puesto que usa una pila para almacenar los o smbolos a reconocer en vez de llamadas a procedimientos recursivos. C mo construir la tabla de an lisis sint ctico o a a Entrada: una gram tica G a Salida: la tabla de an lisis sint ctico, con una la para cada no-terminal, a a una columna para cada terminal y otra para . M todo: e
donde
es el
94
axioma.
hacer: Para cada terminal , en la casilla M[A,a]. a adir la producci n n o Si , en la casilla a adir n
Las celdas de la tabla que hayan quedado vacas se denen como error.
Pueden aparecer m s de una producci n en una misma casilla. Esto supona o dra que estamos en el caso no-determinista en el que tendramos que pro bar una producci n y si esta produce un error, probar la otra... Ineciente. o Las gram ticas LL(1) garantizan que s lo tenemos una producci n por a o o casilla. As, el coste del an lisis es lineal con el n mero de componentes a u l xicos de la entrada. e Teorema: Una gram tica es LL(1) si y s lo si el algoritmo de a o construcci n de la tabla de an lisis sint ctico no genera ninguna o a a celda con m s de una producci n, es decir, si para todo par de a o tales que y , . smbolos
95
+ E E T T F
) err
num
id
err err
err
err
err
err
err
err
err
err
err
err
err
err
err
err
err
err
err
Insertar el calculo de la tabla. Insertar el contenido de la pila, la entrada y la producci n utilizada para o procesar la entrada num+num*num#.
4.6 ANALISIS SINTACTICO Y ACCIONES SEMANTICAS Las acciones sem nticas insertadas en las producciones de la gram tica se a a pueden considerar como si fueran smbolos adiciones y que tienen aso ciado un procedimiento a ejecutar (Smbolos de acciones). Las llamadas a rutinas sem nticas no se les pasa param tros explcitos, los par metros a e a necesarios se pueden transmitir a traves de una pila sem ntica. En los a analizadores descendentes recursivos, la pila de an lisis sint ctico est a a a escondida en la pila de llamadas recursivas a los procedimientos. La pila sem ntica tambi n se puede esconder, si hacemos que cada rutina a e sem ntica devuelva informaci n. a o El programa conductor (driver) para gestionar acciones sem nticas sera: a
96
Entrada: Salida:
sintct. a
y una gramtica G a
una indicacin de error o M todo: e Como configuracin inicial se tiene en el fondo de la pila el smbolo o el axioma en la cima y la cadena en el buffer de entrada. ,
Iniciar preanlisis con el primer smbolo de . a repetir Sea si el smbolo de la cima de la pila es un terminal o si
extraer de la pila y obtener nuevo componente lxico e
extraer meter
de la pila con
en la cima de la pila
sino si
sino error(); hasta que (* la pila est vaca y hemos procesado toda la entrada*) a
Determinar si el programa es sint cticamente correcto (reconocedor). a Proporcionar un mensaje de error signicativo.
parser error: line 10 column 4, found simbol expected simbol ;
Reanudar el an lisis tan pronto como sea posible. Sino podemos a perder demasiada parte de la entrada.
97
Evitar errores en cascada, un error genera una secuencia de sucesivos errores espurios. Para evitarlo se debe consumir (ignorar parte de la entrada). Realizar una correcci n (reparaci n) del error. El analizador inteno o ta inferir un programa correcto de uno incorrecto. Correccion de mnima distancia (el n mero de tokens que deben ser insertados, bor u rados o cambiados debe ser mnimo). Extremadamente complicado adivinar la intenci n del programador. S lo util para situaciones o o sencillas como: falta ;.
Los m todos de recuperaci n de errores suelen ser m todos ad-hoc, en el e o e sentido de que se aplican a lenguajes especcos y a m todos concretos de e an lisis sint ctico (descendente, ascendente. etc), con muchas situaciones a a particulares. Para emitir un mensaje signicativo de error se usa el conjunto de smbolos de PREDICCION denidos para cada no-terminal como: , Dada si entonces sino
98
Recuperaci n en modo de p nico: se ignoran smbolos de la entrada hasta o a encontrar un componente l xico con el cual reanudar el an lisis. En el peor e a caso se podra haber consumido por completo el resto del chero que queda por analizar (panic mode), en cuyo caso no sera mejor que simplemente hacer terminar con el an lisis al detectar el error. a Si se implementa con cuidado puede ser mejor que lo que su nombre implica (N. Wirth en su intento de mejorar su imagen le llam dont panic o mode).
4.7.1 Recuperaci n de errores sint cticos en el m todo descendente o a e predictivo recursivo Implementaci n o A cada procedimiento se le proporciona un conjunto de tokens de sincronizaci n (cada no-terminal de la gram tica se le asocia un conjunto o a de sincronizaci n). Si se encuentra un error, el analizador avanza en la o entrada (consume tokens), ignorando tokens hasta que encuentra uno del conjunto de sincronizaci n, a partir del cual se continua con el an lisis. o a Qu componentes l xicos nos van a servir para establecer una sine e cronizaci n? o
99
Una forma sencilla de implementar la recuperacion en modo de p nico es a al principio de cada procedimiento comprobar si el smbolo de prean lisis a pertenece al conjunto de SINC. Si no pertenece al conjunto de SINC, entonces ignoramos parte de la entrada hasta que encontremos un token que pertenezca al conjunto de SINC. Si el token actual pertenece al conjunto de PRIM entonces ejecutamos el contenido del procedimiento, puesto que hemos encontrado lo primero que el genera. Sino (es que pertenece al de SIG), salimos del procedimiento sin ejecutar su cuerpo, pues quiere decir que ya hemos encontrado lo que sigue a ese no-terminal y por tanto, no podemos pretender reconocerlo.
Procedimiento A(FIRSTSet, FOLLOWSet) while not (preanalisis (FIRSTSet FOLLOWSet #) )
100
4.7.2 Recuperaci n de errores sint cticos en el m todo dirigido por o a e tabla Para cada no-terminal se marcan las casillas correspondientes a los smbolos de sincronizaci n con la palabra , siempre que no exista una produco ci n. o Implementaci n: o est en blanco, es decir , a Si al buscar en la tabla avanzamos en la entrada hasta encontrar un terminal de sincronizacion. Si se saca el no-terminal A de la pila (desistimos de reconoo cerlo). Si no se saca y se aplica la producci n correspondiente. La primera situaci n corresponde al caso en que se han omitido smbolos o y no podemos reconocer lo que genera el no-terminal y el segundo caso corresponde a que hay un exceso de smbolos que hay que ignorar en la entrada. Insertar el procesado de la entrada anterior. para la gram tica a
101
4.8 EJERCICIOS 1 (0.2 ptos) Demuestra que la gram tica siguiente no es LL(1). a
Construye el pseudocodigo correspondiente para un analizador descendente recursivo como si lo fuera y comenta el problema que se encuentra. 2 (0.2 ptos) Demuestra que la gram tica siguiente es LL(1). a
Construye el pseudocodigo correspondiente para un analizador descendente y analiza la entrada . 3 (0.2 ptos) Dada la siguiente gram tica: a
Stmt Assign stmt Call stmt other Assign stmt id := Exp Call stmt id ( Exp )
Escribe el pseudoc digo para analizar de forma descendente recursiva o esta gram tica. Muestra la traza para una entrada concreta. a 4 (0.25 ptos) Dada la siguiente gram tica: a
Lexp Atom List Atom num id List ( Lexp seq ) Lexp seq Lexp , Lexp seq Lexp
Factoriza la gram tica. a Construye el conjunto de PRIMEROS y SIGUIENTES para los no-terminales de la gram tica resultante. a Muestra que la gram tica generada es LL(1). a
102
4.8. EJERCICIOS
Construye la tabla de an lisis sint ctico. a a Muestra el contenido de la pila, de la entrada y las producciones aplicadas para la entrada (a, (b, (2)), (c))
5 (0.2 ptos) Considera el siguiente fragmento de gram tica que permite a generar identicadores como etiquetas:
Stnt Label Unlabeled stmt Label id : Label Unlabeled stmt id := Expresion
Es LL(1)? Si no, transformala para que lo sea. Implementa un analizador descendente recursivo y dibuja la traza de llamadas recursivas a procedimientos para reconocer la cadena de entrada: etiqueta1 : a:= 3 + 4; 6 (0.25 ptos) Dada la siguiente gram tica de una simplicaci n de las a o declaraciones en C:
Declaration Type Var list int oat Type Var list identier , Var list identier
Factoriza la gram tica. a Construye el conjunto de PRIMEROS y SIGUIENTES para los no-terminales de la gram tica resultante. a Muestra que la gram tica resultante es LL(1). a Construye la tabla de an lisis sint ctico. a a Muestra el contenido de la pila, de la entrada y las producciones elegidas para la entrada int x,y,z
103
Calcula el conjunto de smbolos de sincronizaci n y aplica el o m todo de recuperaci n en modo de p nico para la entrada int x e o a y, z emitiendo un mensaje de error signicativo (calcula el con junto de PREDICCION).
104
4.8. EJERCICIOS
7 (0.2 ptos) Dada la siguiente gram tica que genera una lista de sentena cias donde pueden aparecer asignaciones, sentencias condicionales y bloques de sentencias:
L S C S L;S id := C if ( C ) then S begin L end id = id id id id and id
Demuestra que no es LL(1). Hallar una gram tica LL(1) equivalente y construye la tabla de a an lisis sint ctico. a a Muestra el contenido de la pila, de la entrada y las producciones aplicadas para la entrada if (id=id) then id:= id and id
Ideas:
Parsons Mostrar la idea de como se puede evitar el tener que hacer backtracking si dotamos al analizador la posibilidad de mirar un simbolo de look-ahead en la entrada para anticoparse ne la determinaci n de que terminales son derivables a partir de un cierto smbolo. o Mostrar ejemplo pagina 96, para indicar lo que signica el conjunto de PRIMEROS. Los analizadores que usan el conjunto de PRIMEROS se les conoce como Analizadores Predictivos. Mostrar el problema de que cuando existen producciones , el conjunto de PRIMEROS no es suciente para determinar la producci n o . a utilizar. No nos dice cuando tenemos que usar Insertar dibujo pag 99, en donde se reeja por que el conjunto de SIG de un simbolo tiene que incluir al conjunto de SIG del otro. Indicar que para el calculo de SIG una regla consigo misma no debe ser considerada.
105
Sobre las condiciones para LL(1): si se viola la primera no sabremos que alternativa coger para un mismo smbolo. Si se viola la segunda, enonces abria algun token en la intersecci n seg n el cual no podrio u amos saber si coger la alternativa correspondiente o serivar en . Una forma no-recursiva del analizador predictivo consiste en un programa simple de control que lee de una tabla. Las ventajas es que el procedimiento de control es general, y si se cambia la gramatica solo se reescribe la tabla.