Compilador
Programa objeto
Errores generados
Programa fuente
Durante este proceso, el compilador informa al usuario si hay errores en el programa fuente para su respectivo ajuste.
Estructura del lenguaje fuente
Preprocesador
Programa fuente
Compilador
Programa objeto en lenguaje ensamblador
Ensamblador
Código de máquina relocalizable
Editor de carga y enlace
Código de máquina absoluto
Biblioteca, archivos objetos relocalizables
Analizador Léxico
Analizador sintáctico
Tabla de símbolos
Programa fuente
Programa fuente
Cáculo del descriminante de una ecuación cuadrática
Errores léxicos:
Componente Léxico | Lexemas de ejemplos | Descripción del patrón o regla |
---|---|---|
za1d, xyw_1, user1 | ||
45, 4243, 353 | ||
+ | ||
- | ||
if | ||
for | ||
< |
Ejemplos
Ejemplos
Ejemplos
Si p es una cadena definida en
y q es una cadena definida en
o ambas cadenas están definidas en
a qué será igual
Ejemplos
Ejemplo: sean
Ejemplo: sean
Ejemplo: sea
Ejemplo: sea
Ejemplo: sea
Quiz
Calcular:
Si L es un lenguaje y además:
en función de
en función de
Caso Base:
Suposición:
Si y son e.r. definidas en los alfabetos y , o definidas e el mismo ; y además generan los lenguajes y , se induce que:
Paso inductivo:
3. es una e.r que genera
4. es una e.r que genera
5. es una e.r que genera
Ejemplos:
Una definición regular es darle nombre a una expresión regular con el fin de, por notación y facilidad, usarla en otra expresión regular.
Dado un alfabeto , una definición regular (d.r.) es una secuencia de definiciones de la forma:
: nombre distinto
: es una e.r. con los simbolos de
Ejemplos:
Construye definiciones regulares para:
Cadena x
Autómata Finito
(Reconocedor)
Si
No
Reconocedor de un lenguaje: Programa que toma como entrada una cadena x y responde “si” si x es una frase que pertenece al lenguaje, y “no”, si no lo es.
A partir de una e.r., se construye un reconocedor utilizando un diagrama de transiciones llamado autómata finito
Tipo | Memoria | Complejidad | Reconocimiento |
---|---|---|---|
Determinístico | Menos | Más complejos | Más rápido |
No determinístico | Más | Menos complejos | Más lento |
Autómata Finito Determinístico
Autómata Finito No Determinístico
Modelo matemático formado por una quíntupla
Dado un conjunto S, el conjunto se denomina Potencia de S y es el conjunto formado por todos los subconjuntos de S.
Ejemplo:
Se puede representar mediante un grafo dirigido etiquetado, llamado grafo de transiciones.
Ejemplo:
Componentes del autómata
Tabla de Transiciones
Estado | a | b |
---|---|---|
0 | {0,1} | {0} |
1 | {} | {2} |
2 | {} | {3} |
3 | {} | {} |
Reconocimiento o Aceptación
Un AFN acepta una cadena de entrada x, si y solo si, existe algún camino en el grafo de transiciones, desde el estado de inicio hacia algún estado de aceptación, de tal forma que las etiquetas de las aristas a lo largo del camino deletreen a x.
El camino se realiza mediante transiciones llamadas movimientos.
Reconocimiento o Aceptación
Ejemplo:
Reconoce las cadenas
Modelo matemático formado por una quíntupla
A diferencia del AFN, en el AFD, la función de transición mueve genera un solo estado de S, NO un conjunto.
El AFD se le considera un caso especial del AFN.
Se puede representar también mediante un grafo de transiciones.
Ejemplo:
Componentes del autómata
Tabla de Transiciones
Estado | a | b |
---|---|---|
0 | 1 | 0 |
1 | 1 | 2 |
2 | 1 | 3 |
3 | 1 | 0 |
Reconocimiento o Aceptación
El camino se realiza mediante transiciones llamadas movimientos.
Ejemplo:
Reconoce las cadenas
1. En un AFD, para cada estado s hay como máximo una arista etiquetada con un símbolo de entrada a que sale de s.
2. En un AFN puede haber aristas etiquetadas con la entrada .
Entrada: Una expresión regular definida en un alfabeto .
Salida: Un AFN que acepte el lenguaje
Caso Base:
1. Para la e.r , el AFN es el siguiente:
1. Para la e.r , el AFN es el siguiente:
Este AFN reconoce { }
Este AFN reconoce { }
Suposición:
Si y son AFNs para las e.r y respectivamente; además y son los lenguajes que reconocen respectivamente estas e.r.
Reconoce a
Reconoce a
Paso inductivo:
3. Para la e.r , el AFN es el siguiente:
Reconoce a
Paso inductivo:
4. Para la e.r , el AFN es el siguiente:
Reconoce a
Paso inductivo:
7. Para la e.r , el AFN es el siguiente:
Reconoce a
Paso inductivo:
5. Para la e.r , el AFN es el siguiente:
Reconoce a
Paso inductivo:
6. Para la e.r , el AFN es el siguiente:
Reconoce a
Ejemplos:
Construir el AFN para las expresiones regulares:
Ejemplos:
1. AFN para
Entrada: Un AFN que acepte el lenguaje
Salida: Un AFD no óptimo que acepte el mismo lenguaje.
Operaciones sobre los estados del AFN.
cerradura- (s): Conjunto de estados del AFN alcanzables desde el estado del AFN con transiciones solamente.
Ejemplo:
Operaciones sobre los estados del AFN.
mueve :Conjunto de estados del AFN hacia los cuales hay una transición con el símbolo de entrada desde algún estado en del AFN.
Ejemplo:
Operaciones sobre los estados del AFN.
cerradura- (T): Conjunto de estados del AFN alcanzables desde algún estado del AFN con transiciones solamente.
Ejemplo:
Algoritmo de Subconjuntos
// Al inicio, cerradura-ε(s0) es el único estado dentro de estadosD y no está marcado
MIENTRAS QUE(haya un estado no marcado T en estadosD) HACER:
marcar T;
PARA cada símbolo de entrada a HACER:
U = cerradura-ε(mueve(T,a));
SI U no está en estadosD:
añadir U como estado no marcado a estadosD;
FIN-SI
tranD[T,a] = U;
FIN-PARA
FIN-MIENTRASQUE
Estado | Símbolo(a) | Símbolo(b) |
---|---|---|
tranD
Estado | ||
---|---|---|
Marca |
estadosD
Algoritmo de Subconjuntos
// Al inicio, cerradura-ε(s0) es el único estado dentro de estadosD y no está marcado
MIENTRAS QUE(haya un estado no marcado T en estadosD) HACER:
marcar T;
PARA cada símbolo de entrada a HACER:
U = cerradura-ε(mueve(T,a));
SI U no está en estadosD:
añadir U como estado no marcado a estadosD;
FIN-SI
tranD[T,a] = U;
FIN-PARA
FIN-MIENTRASQUE
Estado | Símbolo(a) | Símbolo(b) |
---|---|---|
tranD
Estado | ||
---|---|---|
Marca |
estadosD
// Al inicio, cerradura-ε(s0) es el único estado dentro de estadosD y no está marcado
MIENTRAS QUE(haya un estado no marcado T en estadosD) HACER:
marcar T;
PARA cada símbolo de entrada a HACER:
U = cerradura-ε(mueve(T,a));
SI U no está en estadosD:
añadir U como estado no marcado a estadosD;
FIN-SI
tranD[T,a] = U;
FIN-PARA
FIN-MIENTRASQUE
Estado | Símbolo(a) | Símbolo(b) |
---|---|---|
A | B | C |
B | B | D |
C | B | C |
D | B | E |
*E | B | C |
tranD
Estado | A | B | C | D | E |
---|---|---|---|---|---|
Marca | - | - | - | - | - |
estadosD
Ejemplo: Hallar el AFD de:
Estado | Símbolo(a) | Símbolo(b) |
---|---|---|
A | B | C |
B | B | D |
C | B | C |
D | B | E |
*E | B | C |
tranD
AFN
AFD-No Óptimo
Algoritmo de Subconjuntos
Entrada: Un AFD No Óptimo que acepte el lenguaje
Salida: Un AFD Óptimo que acepte el mismo lenguaje.
Estado Significativo: Es un estado de un AFN que tiene transiciones de salida diferentes de .
El , si es significativo para algún en .
Ejemplo: En el AFN, cuáles son los estados significativos?
Estados Significativos={2,4,7,8,9,10}
Identificamos los estados significativos para cada subconjunto encontrado en el método anterior y si dos subconjuntos tienen los mismos estados significativos, estos se pueden resumir en un único estado.
Estado | a | b |
---|---|---|
A | B | C |
B | B | D |
C | B | C |
D | B | E |
*E | B | C |
Ejemplo:
Est_Sig(A)={2,4,7}
Est_Sig(B)={2,4,7,8}
Est_Sig(C)={2,4,7}
Est_Sig(D)={2,4,7,9}
Est_Sig(E)={2,4,7,10}
Estado | a | b |
---|---|---|
A | B | A |
B | B | D |
D | B | E |
*E | B | A |
tranD
AFD Óptimo con Estados Significativos
Estado | a | b |
---|---|---|
A | B | A |
B | B | D |
D | B | E |
*E | B | A |
tranD
Al construir el AFN en el método de Thompson, se genera un estado significativo cuando un símbolo del alfabeto aparece en la e.r.
El AFN solo tiene un estado de aceptación, pero este estado no es significativo porque no tiene transiciones de salida.
Por esto se concatena un marcador # a la e.r. r, y se le da al estado de aceptación de r una transición con el símbolo #, convirtiéndolo en estado significativo del AFN para r#.
En la imagen, los estados significativos se representan en numeros. Cuando se realiza el reconocimiento, y la construcción está completa, cualquier estado del AFN con una transición en # debe ser estado de aceptación.
Una e.r aumentada r#, se representa mediante un árbol sintáctico con los siguientes tipos de nodos:
A cada hoja no etiquetada con se le asocia una posición, que es un entero.
Un símbolo repetido en una e.r. tiene varias posiciones.
La posición de cada símbolo se puede identificar con la etiqueta del estado significativo en el AFN, como se observa en la figura.
1 2 3 4 5 6
Ejemplo:
Para la e.r. , construye el árbol sintáctico, y señala las posiciones tanto en la e.r como en el árbol.
1 2 3
1
2
3
Funciones:
anulable(𝑛): Función booleana sobre un nodo 𝑛. El anulable será Verdadero si al aplicarlo sobre el nodo 𝑛, existe la posibilidad de generar la cadena vacía en algún momento; o Falso si nunca la genera.
Ejemplo:
El anulable de las siguientes expresiones es:
Verdadero: Es posible que la e.r genere la cadena vacía.
Falso: No es posible que sea vacía ya que b se repite 1 o mas veces
Verdadero: Es posible que la e.r genere la cadena vacía.
Funciones:
𝑝𝑟𝑖𝑚𝑒𝑟𝑎𝑝𝑜𝑠(𝑛): Función sobre un nodo 𝑛 que devuelve el conjunto de posiciones que pueden concordar con el primer símbolo de una cadena generada por la sub-expresión regular con raíz en 𝑛.
Ejemplo:
El primerapos de las siguientes expresiones es:
1 2 3 4 5
1 2 3 4
1 2 3
1 2 3 4
Funciones:
𝑢𝑙𝑡𝑖𝑚𝑎𝑝𝑜𝑠(𝑛): Función sobre un nodo 𝑛 que devuelve el conjunto de posiciones que pueden concordar con el último símbolo de una cadena generada por la sub-expresión regular con raíz en 𝑛.
Ejemplo:
El ultimapos de las siguientes expresiones es:
1 2 3 4 5
1 2 3 4
1 2 3
1 2 3 4
Reglas para resolver las funciones en los nodos
Reglas para resolver las funciones en los nodos
Ejemplo:
𝑎𝑛𝑢𝑙𝑎𝑏𝑙𝑒, 𝑝𝑟𝑖𝑚𝑒𝑟𝑎𝑝𝑜𝑠 𝑦 𝑢𝑙𝑡𝑖𝑚𝑎𝑝𝑜𝑠 para
Cálculo del siguientepos:
𝑠𝑖𝑔𝑢𝑖𝑒𝑛𝑡𝑒𝑝𝑜𝑠(𝑖) contiene a
𝑠𝑖𝑔𝑢𝑖𝑒𝑛𝑡𝑒𝑝𝑜𝑠(j) contiene a
Cálculo del siguientepos:
Dado que ya se calcularon el 𝑝𝑟𝑖𝑚𝑒𝑟𝑎𝑝𝑜𝑠 y 𝑢𝑙𝑡𝑖𝑚𝑎𝑝𝑜𝑠 en el árbol sintáctico para cada nodo, se calcula 𝑠𝑖𝑔𝑢𝑖𝑒𝑛𝑡𝑒𝑝𝑜𝑠 haciendo un recorrido de abajo hacia arriba en el árbol.
Posición 𝑖 | 𝒔𝒊𝒈𝒖𝒊𝒆𝒏𝒕𝒆𝒑𝒐𝒔(𝒊) |
---|---|
1 | {1,2,3} |
2 | {1,2,3} |
3 | {4} |
4 | {5} |
5 | {6} |
6 | {} |
// Al inicio, el único estado no marcado en estadosD es primerapos(raiz), donde raiz es la raiz del árbol para (r)#
MIENTRAS QUE(haya un estado no marcado T en estadosD) HACER:
marcar T;
PARA cada símbolo de entrada a HACER:
//sea U el conjunto de posiciones que están en siguientepos(p), para alguna posición en T, tal que el símbolo en la posición p es a;
SI U no está vaciao y no está en estadosD:
añadir U como estado no marcado a estadosD;
FIN-SI
tranD[T,a] = U;
FIN-PARA
FIN-MIENTRASQUE
Estado | Símbolo(a) | Símbolo(b) |
---|---|---|
tranD
Estado | ||
---|---|---|
Marca |
estadosD
// Al inicio, el único estado no marcado en estadosD es primerapos(raiz), donde raiz es la raiz del árbol para (r)#
MIENTRAS QUE(haya un estado no marcado T en estadosD) HACER:
marcar T;
PARA cada símbolo de entrada a HACER:
//sea U el conjunto de posiciones que están en siguientepos(p), para alguna posición en T, tal que el símbolo en la posición p es a;
SI U no está vaciao y no está en estadosD:
añadir U como estado no marcado a estadosD;
FIN-SI
tranD[T,a] = U;
FIN-PARA
FIN-MIENTRASQUE
El estado de inicio del AFD corresponde con la ppos(raiz).
El estado de finalización del AFD contiene la posición de #.
𝑖 | 𝒔𝒑𝒐𝒔(𝒊) |
---|---|
1 | {1,2,3} |
2 | {1,2,3} |
3 | {4} |
4 | {5} |
5 | {6} |
6 | {} |
Estado | a | b |
---|---|---|
A | B | A |
B | B | C |
C | B | D |
*D | B | A |
tranD
Estado | a | b |
---|---|---|
A | B | A |
B | B | C |
C | B | D |
*D | B | A |
tranD
Sistemas de Ecuaciones en E.R.
Ecuación en expresiones regulares: Ecuación lineal donde variables y coeficientes toman la forma de expresiones regulares.
Entrada: Autómata finito , con
Salida: Sistema de ecuaciones donde en determina el lenguaje del AFD.
Método:
Sea una ecuación en expresiones regulares, luego es una solución para la ecuación. Es única si ∈ es generada por 𝑟.
Ejemplo 1:
A=1B | 0A (1)
B=1A | 0B | ∈ (2)
Resolviendo
De (1): Aplicando Ardem
A=0*1B (1’)
Remplazando (1’) en (2)
B=10*1B | 0B | ∈
B= (10*1| 0)B | ∈
B= (10*1 | 0)* ∈ Aplicando Ardem
B= (10*1 | 0)* (2’)
Remplazando. (2’) en (1’)
A=0*1 (10*1 | 0)* Expr. Regular Final
Ejemplo 2:
A= bA | aB (1)
B= bC | aA | ∈ (2)
C=aC | bB (3)
Resolviendo
De (1): Por Ardem
A=b*aB (1’)
De (3): Por Ardem
C=a*bB (3’)
Rempl (1’) y (3’) en (2)
B=ba*bB | ab*aB | ∈
B=(ba*b | ab*a ) B | ∈
B= (ba*b | ab*a )* ∈ Por Ardem
B= (ba*b | ab*a )* (2’)
Rempl en (1’)
A=b*a (ba*b | ab*a )* Exp. Regular
Flex
Especificación Flex
Flex
lex.yy.c
yylex()
digito [0-9]
%%
{digito} {ECHO;}
{digito}+ {ECHO;}
%%
main(){
yylex();
}
r.e | Reconocimiento |
---|---|
x | caracter x |
. | Cualquier carácter excepto nueva línea |
[abc] | una 'a' o una 'b' o una 'c' |
[ab-p] | una 'a' o una 'b' o cualquier letra entre b y p |
[^A-Z] | Caracteres negados: Cualquier carácter excepto una letra mayúscula. |
r* | Cero o más ocurrencias de la e.r r |
r+ | Una o más ocurrencias de la e.r r |
r|s | r o s (unión) |
sr | e.r s seguida de la e.r r (concatenación) |
r.e | Reconocimiento |
---|---|
r? | Cero o una ocurrencia de r |
r{3,6} | De 3 a 6 ocurrencias de r |
{nombre} | e.r de la definición "nombre" |
\x | x: 'a', 'b', 'f', 'n', 'r', 't', o 'v' : ANSI-C. Ow: x |
"[xyz]"\fo" | Cadena literalmente: [xyz]"\fo |
<<EOF>> | Fin del fichero |
digito [0-9]
nentero {digito}+
nreal {nentero}\.{digito}*
%%
{digito} {ECHO;}
{nentero} {ECHO;}
{nreal} {ECHO;}
. {printf("<<error>>");}
<<EOF>> {yyterminate();}
%%
main(){
yylex();
}
Analizador Léxico
Analizador sintáctico
Tabla de símbolos
Programa fuente
Resto de
Etapa Inicial
Árbol de análisis sintáctico
Analizador Sintáctico: Segunda fase de un compilador. Obtiene una cadena de componentes léxicos del Analizador Léxico, y verifica si la cadena puede ser generada por la gramática del lenguaje fuente. Informa de los errores sintácticos que se presenten.
Los lenguajes de programación poseen una estructura inherentemente recursiva que se define gracias a las Gramáticas Independientes del Contexto (GIC).
Las GIC son un modelo matemático formado por una cuadrupla:
1. 𝑻: Terminales: Símbolos básicos con los que se forman las cadenas. Componente léxico es sinónimo de terminal.
2. 𝑵: No terminales: Son variables sintácticas que denotan conjuntos de cadenas. Estos definen conjuntos de cadenas que ayudan a definir el lenguaje generado por la GIC.
3. 𝑺: Símbolo Inicial: Es un No terminal, y define a un conjunto de cadenas que representan al lenguaje generado por la GIC.
4. 𝑷: Producciones: Especifican cómo se combinan los Terminales y los No Terminales para formar cadenas. Cada producción consta de dos partes:
Cabecera: Es un No Terminal, seguido por una flecha
Cuerpo: Cadena de Terminales y No Terminales.
Ejemplo: 𝐴→𝛼 es una producción.
Ejemplo de GIC: Gramática de Operadores Aritméticos
P son las producciones que se encuentran en el lado izquierdo.
Escritura abreviada
Ejemplo de GIC: Gramática de Operadores Aritméticos
P son las producciones que se encuentran en el lado izquierdo.
Escritura abreviada
Ejemplo de GIC:
P son las producciones que se encuentran en el lado izquierdo.
Por convención:
Derivaciones
Una GIC 𝐺 define un lenguaje 𝐿(𝐺).
Las derivaciones establecen el proceso mediante el cual la GIC define un lenguaje.
Se considera cada producción como una regla de escritura, donde el No terminal a la izquierda es sustituido por la cadena del lado derecho de la producción.
Derivaciones
Ejemplo:
Derivar la cadena:
A estas sustituciones se les llama derivación de la cadena
Derivaciones
Reglas y Notaciones:
Dada una GIC 𝐺 con símbolo inicial 𝑆, se utiliza la relación para definir 𝐿(𝐺), el lenguaje generado por 𝐺.
1. Las cadenas en 𝐿(𝐺) pueden contener sólo símbolos terminales de 𝐺; es decir, si 𝜔 está en 𝐿(𝐺), luego 𝜔 es generada por .
2. 𝜔 está en 𝐿(𝐺) sí, y solo sí, 𝑆 𝜔.
Derivaciones
Reglas y Notaciones:
3. A la cadena 𝜔 se le llama frase de 𝐺.
4. A un lenguaje generado por una GIC, se le denomina lenguaje independiente del contexto (LIC).
5. Dos GIC que generan el mismo lenguaje, se les denomina GIC’s equivalentes. Es decir, si 𝐿(𝐺) = 𝐿(𝐺′), luego 𝐺≅𝐺′.
6. Si 𝑆 𝛼, donde 𝛼 puede contener no terminales, luego 𝛼 es una forma de frase de 𝐺.
7. Una frase es una forma de frase sin no terminales.
Derivaciones
Ejemplo:
En la siguiente derivación:
es una frase de la GIC.
son formas de frase de la GIC.
Derivaciones
Tipos de derivaciones
Derivación 1: Más Izquierda
Derivación 2: Más Izquierda
Derivaciones
Tipos de derivaciones
Derivación 3: Más Derecha
Derivación 4: Más Derecha
Derivaciones
Tipos de derivaciones
Derivación Más Izquierda
Se realiza la sustitución del no terminal que se encuentra más a la izquierda de cualquier forma de frase.
𝑤𝐴𝛾 𝑤𝛿𝛾, donde 𝑤 está formada solo de terminales, 𝐴→𝛿 es la producción aplicada y 𝛾 es una cadena de símbolos gramaticales.
Aquí 𝑤𝛿𝛾 es una forma de frase izquierda de la GIC.
Derivaciones
Tipos de derivaciones
Derivación Más Derecha
Se realiza la sustitución del no terminal que se encuentra más a la derecha de cualquier forma de frase.
𝛾𝐴𝑤 𝛾𝛿𝑤, donde 𝑤 está formada solo de terminales, 𝐴→𝛿 es la producción aplicada y 𝛾 es una cadena de símbolos gramaticales.
Aquí 𝛾𝛿𝑤 es una forma de frase derecha de la GIC.
Derivaciones
Ambigüedad
Una GIC que genera una cadena con más de una derivación del mismo tipo, se considera ambigua.
Analizar ambigüedad de la primera y segunda GIC de Operadores Aritméticos
Derivaciones
Árbol de análisis sintáctico
Es una representación gráfica de una derivación que no muestra la elección relativa al orden de sustitución.
Cada nodo interior del árbol se etiqueta con algún no terminal A.
Los hijos de este nodo interior A, se etiquetan, de izquierda a derecha, con los símbolos del lado derecho de la producción por la cual se sustituyó esta A en la derivación.
Las hojas del árbol en cualquier momento se pueden leer de izquierda a derecha y forman una forma de frase, llamada frontera del árbol.
Derivaciones
Árbol de análisis sintáctico
Ejemplo: Derivación 1: Más Izquierda
Arbol de análisis sintáctico
Derivación final
Derivaciones
Árbol de análisis sintáctico
Ejercicio: Dada la GIC, construye los AAS correspondientes
Derivación 2: Más Izquierda
Derivación 3: Más Derecha
Derivación 4: Más Derecha
Escritura de una Gramática
Expresiones regulares a GIC
Toda e.r se puede escribir como una GIC. Con las siguientes reglas:
: Si existe un movimiento que sale del estado i con el símbolo a
Escritura de una Gramática
Expresiones regulares a GIC
Ejemplo: Convertir a una GIC la e.r a partir de AFD óptimo
Escritura de una Gramática
Eliminación de Recursividad Izquierda
Una GIC es recursiva por izquierda si tiene un no terminal 𝐴 tal que existe una derivación 𝐴 𝐴𝛼 para alguna cadena 𝛼. Es decir que el no terminal tiene producciones con el mismo no terminal a la izquierda.
Los analizadores sintácticos descendentes no pueden manejar gramáticas recursivas por la izquierda.
Escritura de una Gramática
Eliminación de Recursividad Izquierda
Método Simple:
Dada la GIC , la GIC sin recursividad:
Ejemplo: Dada la GIC, eliminar la recursividad
Escritura de una Gramática
Eliminación de Recursividad Izquierda
Método Compuesto:
Dada la GIC , la GIC sin recursividad es:
Si , entonces , se convierte en el caso simple y se elimina igual que ese método:
Escritura de una Gramática
Eliminación de Recursividad Izquierda
Método Compuesto:
Ejemplo: Eliminar recursividad
Escritura de una Gramática
Factorización por Izquierda
Es otra transformación necesaria de una GIC para utilizarla en un Analizador Sintáctico Descendente.
Dada la GIC
Método:
Se transforma en la GIC equivalente:
Escritura de una Gramática
Factorización por Izquierda
Ejemplo: Dada la GIC, realiza la factorización izquierda