Análisis Sintáctico y Gramáticas GLC
Análisis Sintáctico y Gramáticas GLC
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Capítulo 6: Análisis Sintáctico.
6.1 GLC
En lingüística e informática, las Gramáticas Libres de Contexto (GLC) o, en inglés,
Context Free Grammars (CFG), juegan un papel central en el procesamiento de
lenguaje natural desde los 50’s y en los compiladores desde los 60’s. De acuerdo
con la mayoría de los autores, las GLC son un conjunto finito de símbolos o
variables que representan categorías aplicables a elementos léxicos y son muy
útiles para definir relaciones entre objetos sintácticos tales como la sintaxis de un
lenguaje de programación.
102
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Definición: Gramática
Formalmente una gramática se define como sigue:
G(T, N, P, S)
donde:
T es el conjunto de símbolos terminales
N es el conjunto de símbolos no terminales
P es el conjunto de producciones
S ∈ N es el símbolo inicial.
L(G) = L(T, N, P, S)
El lenguaje generado por esta gramática es: L(G)={0n1n | n>=1}, es decir, cadenas
con igual número de 1s y 0s en forma consecutiva.
6.2 Árboles de derivación.
Un árbol de derivación permite mostrar gráficamente cómo se puede derivar
cualquier cadena de un lenguaje a partir del símbolo distinguido de una gramática
que genera ese lenguaje.
• Hay un único nodo distinguido, llamado raíz (se dibuja en la parte superior)
que no tiene arcos incidentes.
• Todo nodo c excepto el nodo raíz está conectado con un arco a otro
nodo k, llamado el padre de c (c es el hijo de k). El padre de un nodo, se
dibuja por encima del nodo.
• Todos los nodos están conectados al nodo raíz mediante un único camino.
103
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
• Los nodos que no tienen hijos se denominan hojas, el resto de los nodos se
denominan nodos interiores. Ver Fig. 6.1.
• Algunas veces se utilizan círculos para representar nodos, pero también se
pueden representar solo los arcos y los contenidos de los nodos, sin los
círculos.
Nodo raíz
Nodos interiores
Hojas
Para cada cadena del lenguaje generado por una gramática es posible construir
(al menos) un árbol de derivación, en el cual cada hoja tiene como rótulo uno de
los símbolos de la cadena.
104
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
a S b
a S b
a b
Definición: Ahora podemos definir un lenguaje L(G) como el conjunto de todas las
cadenas de símbolos terminales que pueden derivarse del símbolo inicial S.
L = {σ | S ⎯
⎯→
*
σ y σ∈T*}
105
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
T0 = {x, y, +, -, *, /, (, )}
N0 = {expr, term, factor}
P0 = { expr→term | expr + term | expr – term
term→ factor| term * factor| term/factor
factor → x | y | (expr)
}
S0 = {expr}
106
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Una regla BNF ν→σ especifica que un solo símbolo no terminal ν∈N puede ser
sustituido por σ∈(N∪T*) sin importar el contexto donde aparezca ν.
Una gramática independiente del contexto es no ambigua, si y solo si hay una sola
derivación por la derecha (o por la izquierda) y, por lo tanto, un solo árbol de
análisis sintáctico (es decir, la secuencia de derivaciones representada como una
estructura de árbol) para cada frase que pueda derivarse con las producciones de
la gramática.
107
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Se pueden definir otras gramáticas que producen el mismo lenguaje que G0.
T’0 = {x, y, +, -, *, /, (, )}
N’0 = {exp, op}
P’0 = { exp→exp op exp| (exp) | x | y
op → +|-|*|/
}
S’0 = {exp}
108
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
exp
exp op exp
exp op exp
x + y ‐ x * y
exp
exp op exp
x + y ‐ x * y
109
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
T’’0 = {x, y, +, -, *, /, (, )}
N’’0 = {expr}
P’’0 = { expr→expr + expr| expr –expr | expr * expr| expr / expr| (expr) |x | y
}
S’’0 = {expr}
Se dice que una gramática lineal izquierda si cada producción P tiene la forma
A→Ba o A→a, donde A y B están en N y ‘a’ esta en T*.
Se dice que una gramática lineal derecha si cada producción P tiene la forma
A→aB o A→a, donde A y B están en N y ‘a’ esta en T*.
110
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
6.3 Formas normales de Chomsky (FNC).
Definición de la Forma Normal de Chomsky
Una Gramática Libre de Contexto (GLC), G=(N,T,P,S) que no genera la cadena
vacía, está en FNC cuando todas sus reglas son de la forma:
A → BC o
A → a, con A, B, C Nya T
111
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Método:
PASO 1
N'=N; P'= ;
Para toda regla (A → α) de P hacer
Si |α|=1 entonces añadir la regla a P' (*ya esta en FNC*)
Si no sea α=X1X2...Xm con m > 1
Para i=1 hasta m hacer
Si Xi=a Σ Entonces
Se añade a N' un nuevo no terminal Ca
Se añade a P' una nueva regla (Ca→ a)
finsi
finpara
Se añade a P' una regla (A → X'1X'2...X'm) con:
X'i=Xi si Xi N
X'i=Ca si Xi = a Σ
finSi
finPara
PASO 2
(*Se toma como entrada la gramática G' resultante del PASO 1*)
N''=N'; P''= ;
Para toda regla (A → α) de P' hacer
Si |α| < 3
Entonces añadir la regla a P'' (*ya esta en FNC*)
Si no sea α = B1B2 ...Bm con m > 2
Añadir a N' los no terminales {D1, D2, ..., Dm-2}
Añadir a P'' el siguiente conjunto de reglas:
A → B1D1
D1→ B2D2
...
Dm-3 → Bm-2Dm-2
Dm-2 → Bm-1Bm
finSi
finPara
112
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
S → bA | aB
A → bAA | aS | a
B → aBB | bS | b
S → CbA | CaB
A → CbAA | CaS | a
B → CaBB | CbS | b
Ca→ a
Cb→ b
S → CbA | CaB
A → CbD1 | CaS | a
D1→ AA
B → CaD2 | CbS | b
D2→ BB
Ca→ a
Cb→ b
6.4 Diagramas de sintaxis.
De esta forma todos los posibles caminos desde el inicio del grafo hasta el final,
representan formas sentenciales válidas.
113
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
S2
...
Sn
Figura 6.6 Grafo sintáctico para representar múltiples opciones (alternativas)
S S ... Sn
Repetición: Los grafos sintácticos para expresar repeticiones (R3 y R4) son
mostrados en la Fig. 6.8.
R3. Cero o más veces: N → S*, a veces representado también como {S}, para
indicar que la S puede aparecer cero o más veces.
R4. Cero o una ocurrencia: [S], indica que S puede aparecer cero o una vez.
a) {S}
b) [S]
S
Figura 6.8 Grafos sintácticos para representar repetición
114
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
t
Figura 6.10 Grafo sintáctico para representar condicional
Con ayuda de estos diagramas (R1 a R6) podemos representar la sintaxis de
cualquier lenguaje, tal como lo podemos hacer utilizando la notación BNF.
T F
E T
+ *
T F *
- /
F id
( E )
115
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
6.5 Eliminación de la ambigüedad.
6.5.1 Ambigüedad en una Gramática Libre de Contexto (GLC).
S ⇒ aS ⇒ aa
S ⇒ Sa ⇒ aa
Figura 6.12. Dos derivaciones para “aa” con la gramática ambigua S→aS|Sa|a
1) E→E+E
2) E→E*E
3) E→x
4) E→y
116
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
1. Ambigüedad Inherente:
L = {anbncmdm | n ≥ 1, m ≥ 1} ∪ {anbmcmdn | n ≥ 1, m ≥ 1}
S → AB | C
A → aAb | ab
B → cBd | cd
C → aCd | aDd
D → bDc | bc
La gramática es ambigua, hay cadenas con más de una derivación más izquierda.
Considere la cadena “aabbccdd” (m = n = 2), esta puede ser generada por dos
árboles diferentes (Fig. 6.14).
117
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
S S
A B
C
a A b c B d
a C d
a b c d
a D d
b D c
b c
2. Ambigüedad Transitoria
Este tipo de ambigüedad puede llegar a ser eliminada realizando una serie de
transformaciones sobre la gramática original. Una vez que se logra lo anterior, la
gramática puede ser reconocida por la mayoría de los analizadores sintácticos.
Generalmente la Ambigüedad Transitoria se presenta en dos casos, cuando:
No existe un algoritmo que nos indique si una Gramática Libre de Contexto (GLC)
es ambigua. Existen LLC que sólo tienen GLC ambiguas, es decir inherentemente
ambiguos.
118
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
E→I
E→E+E E A
E→E*E
E → (E)
E→a E + E E * E
E→b
E → Ia
E → Ib E * E E + E
E → I0 a) b)
E → I1
Figura 6.15. Gramática ambigua
119
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
E + T
T T * F
F F I
I I a
a a
Figura 6.17. Árbol de derivación único para la cadena “a+a*a”
120
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Dada la forma de las dos reglas para T, el único árbol de derivación para una
secuencia de factores es el que separa f1*f2* …* fn, para n>1 en un término f1*f2*
…* fn-1 y un factor fn. La razón es que F no puede derivar expresiones tales como
fn-1 * fn sin introducir paréntesis. Así, no es posible que al usar la producción T →
F|T * F, la F derive otra cosa no sea factor. Esto es, el árbol de derivación para un
término pueden ser solo como en la Figura 6.18.
T * F
T * F
:
:
T
T * F
F
Del mismo modo una expresión es una secuencia de términos conectados por +.
Cuando se usa la producción E → T|E + T para derivar t1 +t2 +. . . , tn, entonces T
debe derivar solo a tn, y la E en el cuerpo deriva t1 + t2 + . . . tn−1. La razón,
nuevamente, es que T no puede derivar la suma de dos o más términos sin usar
paréntesis que los agrupe.
121
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Ejemplo: Asumiendo que contamos con una gramática ambigua G con la regla
A → bB, A → bC. El AFND de G sería como se muestra en la Fig. 6.19.
A
b
b
B C
Cuando el autómata lee ‘b’ mediante la transición δ(A, b) = {B, C}, la G puede
producir ‘b’ aplicando bien la regla de producción A → bB o bien A → bC. En
definitiva la ambigüedad en un AFND tiene aparejada una ambigüedad en la
gramática que genera las palabras que el autómata acepta.
122
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
if (0)
{
if (1) otro
}
else otro
if (0) then
if (1) otro else otro endif
endif
if (0) then
if (1) otro endif
else
otro
endif
6.6 Generación de matriz predictiva (cálculo first y
follow).
6.6.1 Gramática LL
123
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Definición: PRIMERO
El algoritmo de la Fig. 6.20, indica cómo construir el conjunto PRIMERO, dada una
gramática G.
124
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
T = {x, y, z}
N = {A, B, C}
P = {A → B|C
B → xB | y
C → xC|z}
S = {A}
125
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
PRIMERO(S') = {e, f, g, h, ε}
PRIMERO(S) = {e, f, g, h, ε }
PRIMERO(A) = {e, ε }
PRIMERO(B) = {h }
PRIMERO(C) = {f, g}
PRIMERO(D) = {g}
Definición: SIGUIENTE
Sea X un símbolo no terminal entonces, SIGUIENTE(X) es el conjunto de
todos los símbolos terminales que pueden parecer inmediatamente a la
derecha de X, es decir:
126
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
W→YZ
V→Wx
El conjunto SIGUIENTE (W) = {x}, pero ¿cual sería el conjunto SIGUIENTE (Z)?
La respuesta está constenida en la línea marcada con (*1*), en el algoritmo de la
Fig. 6.21, que indica que se incluya el conjunto SIGUIENTE(W) en el conjunto
SIGUIENTE(Z), de tal modo que para este ejemplo particular, SIGUIENTE(Z) =
SIGUIENTE (W) = {x}.
No
PRIMERO SIGUIENTE
terminales
S' e, f, g, h vacío
S e, f, g, h $
A e, ε h
B h $
C f, g f
D g f, g
127
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Antes de incluir más ejemplos del cálculo de conjuntos SIGUIENTE, vale la pena
un comentario sobre el símbolo ’$’. Durante el análisis sintáctico cada cadena
analizada es terminada con el símbolo ‘$’, es decir, es una marca de terminación
de la cadena que se está analizando. Así, esta marca también forma parte del
conjunto SIGUIENTE en los siguientes dos casos:
T= {a, b}
N = {S, A, B}
P={S→Ab
A→a|B|ε
B → b | ε}
S = {S}
128
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Una gramática que no es LL(1) puede originar bloqueos mutuos como se ilustra en
el siguiente ejemplo.
129
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Esta gramática nos puede originar bloqueos mutuos, por ejemplo si tratamos de
derivar la frase x,
A → Bx
→ xx
T3 = {+, a, b, c}
N3 = {S, A, B}
P3 = { S → A | B
A → cA+b | a
B → cB+a | b }
S3 = {S}
σ PRIMERO(σ) SIGUIENTE (σ)
a a No definido
b b No definido
c c No definido
+ + No definido
A c, a +
B c, b +
S a, b, c $
Una gramática G es ambigua si hay una palabra en L(G) que posea dos
derivaciones por la izquierda (a partir del símbolo inicial). Equivalentemente: Hay
una producción con dos alternativas que generen los mismos símbolos iniciales y
por lo tanto C1 es violada.
130
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
PRIMERO (E O E) = {(, x, y}
PRIMERO ((E)) = {(}
Por otra parte, una gramática LL(1) no puede ser recursiva izquierda
Demostración:
Condición C2)
Supongamos que
a) la gramática tiene una producción recursiva izquierda X→Xσ1
b) y que X puede derivar la cadena vacía X *→ ε (C2)
Entonces:
1: PRIMERO (σ1 )⊂ PRIMERO (X) y (dado que X ⎯ ⎯→*
ε)
2: PRIMERO (σ1 )⊂ SIGUIENTE (X)
Esto implica que:
PRIMERO (σ1) ⊂ (PRIMERO (X) ∩ SIGUIENTE (X)) ≠ ∅
Lo cual contradice C2
Condición C1)
Nuevamente, bajo la suposición de que la gramática tiene una producción
recursiva izquierda:
X→Xσ1 Si X no deriva a ε (i,e. no es cierto que X ⎯⎯→
*
ε (C1)),
Entonces:
Debe existir una producción X→σ2 y σ2 ⎯ ⎯→
*
t , donde t ∈ T
Lo cual implica que X→Xσ1 | σ2 (por la suposición inicial)
De lo cual se desprende que
PRIMERO (Xσ1) ∩ PRIMERO (σ2) = t
Lo cual contradice C1 y permite terminar la demostración.
131
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Podemos observar que PRIMERO (Aa) = PRIMERO (b) = {b}, por lo cual no
cumple con C1 y por lo tanto G no es LL (1) .
6.6.2 Matriz predictiva
Una matriz predictiva es una tabla que contiene las producciones de una
gramática, de tal modo que es posible desarrollar programas “genéricos”, que
realicen el análisis de sintáctico de cualquier gramática LL(1) contenida en dicha
tabla. Esto será detallado en la siguiente sección. Por el momento se revisará el
algoritmo para generar la tabla predictiva.
132
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
σ PRIMERO(σ) SIGUIENTE(σ)
id id No definido
+ + No definido
- - No definido
* * No definido
/ / No definido
( ( No definido
) ) No definido
EXP id, ( )
E +, -, ε ), $
TERM id, ( ), +, -
T *, /, ε ), +, -, $
FACTOR id, ( ), +, -, *, /
C1)
- PRIMERO( id ) ∩ PRIMERO((EXP) ) = {id} ∩ {(} = ∅
- PRIMERO(+ TERM E) ∩ PRIMERO( -TERM E) ∩ PRIMERO(ε) = {+} ∩ {-} ∩
{ε} = ∅
- PRIMERO(* FACTOR T) ∩ PRIMERO(/ FACTOR T) ∩ PRIMERO(ε) = {*} ∩
{/} ∩ {ε} = ∅
C2)
- PRIMERO(E) ∩ SIGUIENTE(E) = {+, -, ε} ∩ {), $} = ∅
- PRIMERO(T) ∩ SIGUIENTE(T) = {*, /, ε} ∩ {), +, -, $} = ∅
FOR {∀ (N →σ) ∈ P} DO
FOR {∀ t∈T: t ∈ PRIMERO (σ)} DO
añadir N → σ a P [N, t];
IF (σ ⎯⎯→
*
ε) THEN
FOR {∀ x ∈ SIGUIENTE (N)} DO añadir N→σ a P [N, x];
END;
END;
133
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
N\T id + - * / ( ) $
EXP TERM E TERM E
E +TERM E -TERM E ε ε
TERM FACTOR T FACTOR T
T ε ε *FACTOR T /FACTOR T ε ε
FACTOR id (EXP)
6.7 Tipos de analizadores sintácticos.
El analizador sintáctico, analiza secuencias de símbolos para determinar si serán
aceptadas por el lenguaje de programación de que se trate.
134
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
El ASDR intenta encontrar una derivación por la izquierda para una entrada dada,
y generar un árbol de análisis sintáctico desde la parte superior (desde el axioma
de la gramática o símbolo inicial), hasta las hojas de dicho árbol. Dicho en otras
palabras, el ASDR al analizar un entrada, inicia con el símbolo inicial, después
mientras haya hojas etiquetadas con símbolos no terminales, se selecciona una de
las producciones que corresponda con la etiqueta del nodo, para formar las hojas
del nodo no terminal, de acuerdo con el lado derecho de la producción. Así la
entrada es correcta si la secuencia de hojas terminales corresponde a la
secuencia de símbolos de entrada..
El ASDR puede aplicarse a otros tipos de gramáticas, pero solo las gramáticas
LL(1) permiten este tipo de análisis sin bloqueos mutuos.
El siguiente ejemplo ilustra lo que sucede cuando trata de aplicarse el ASDR a una
gramática que no es LL(1).
T5 = {a, b, c, d, e}
N5 = {S, A, B}
P5 = { S → cAd | dBc
A → ab | a
B → ae | A}
S5 = { S }
Verificando las condición C1 de las gramáticas LL(1):
Al tratar de aplicar el ASDR para derivar la cadena “dac” usando G5, se obtiene lo
siguiente (Fig. 6.22):
135
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
i) ii)
S d a c ⇒ d a c S d a c ⇒ d a c
c A d d B c
ii) iv)
S d a c ⇒ d a c S d a c ⇒ d a c
d B c d B c
a e A
a b
v)
S
d B c
A
a d a c ⇒ d a c
136
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
i) ii)
A p b s e. ⇒ p b s e . A p b s e . ⇒ p b s e .
p X p X
b s Y e . p b s e . ⇒ p b s e .
iii)
A
p X
b s e . pbse. ⇒pbse.
137
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Así, dada la gramática G(T, N, P, S) que es LL(1), donde N = {N1, N2, …, Nm} y S =
N0, el ASDR está dado por la estructura de la Fig. 2.24.
PROGRAM
PROCEDURE Error(…);
PROCEDURE N0; . . .;
PROCEDURE N1; . . .;
...
PROCEDURE Nm; . . .;
BEGIN
LeerSimbolo;
N0;
END.
Figura 2.24. Estructura del analizador sintáctico descendente recursivo-ASDR.
En la sección 6.4 se mostro que había una equivalencia entre grafos sintácticos y
la notación BNF. Es posible también asociar un programa a cada grafo sintáctico
como se muestra a continuación.
S1
S2
...
Sn
138
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
S S ... Sn
139
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
P(S);
t
IF ch = ‘t’ THEN LeeSimbolo (ch) ELSE Error;
Figura 6.30 Grafo sintáctico para representar condicional
Con ayuda de estos diagramas y los programas asociados de las reglas (M1 a M6)
podemos desarrollar ASDR de una gramática LL(1).
PRIMERO (id) ∩ PRIMERO ((E)) = {id} ∩ {(} = ∅. Por lo tanto G6 es una gramática
LL(1).
140
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
PROGRAM AnalizadorSintactico;
VAR_Global símbolo
Actividad:
Tomando como base el seudocódigo anterior, verificar si la expresión “(a + b) * c”
pertenece al lenguaje generado por la gramática G6.
141
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
este método se le llama Análisis Sintáctico Tabular (AST) y son componentes son
mostradas en la Fig. 6.31.
a) Buffer de entrada:
Contiene la cadena a analizar seguida de $ (fin de cadena)
Entrada
a + b - a * b $
Pila X
Y Programa Tabla de análisis
Z de análisis sintáctico
A
$
Figura 6.31. Modelo del análisis sintáctico tabular
b) Pila:
Al inicio solo tiene el símbolo $ y el símbolo inicial de la gramática
c) Tabla de análisis sintáctico:
Es una matriz bidimensional [Ni, t] = [No terminal, terminal]
d) Programa de análisis:
Coordina el uso de las otras componentes
142
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
REPEAT
If X IN T THEN
IF X = a THEN
Sacar X de la pila y leer el siguiente caracter de entrada “a”
ELSE Error
ELSE (*X∈N*)
IF P(X, a) = X → Y1 Y2, … Ym THEN
Reemplazar X en la cima de la pila por Ym… Y2 Y1
(Y1 queda en la cima de la pila; la salida es X → Y1 Y2 … Ym)
ELSE Error (*P(X, a) esta vacio*)
UNTIL (X= $) AND (a = $):
143
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Ejemplo.
1. Comprobar si la gramática G, cuyo conjunto de producciones es:
S → cA
A → aB
B→b|ε
es LL(1) y si es así, construir la tabla de análisis sintáctico, calculando todos
los conjuntos PRIMERO y SIGUIENTE.
144
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
PRIMERO SIGUIENTE
S c
A a $
B b, ε $
N\T a b c $
S cA
A aB
B b ε
145
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Mando
Es una subcadena de una cadena que puede reducirse usando el lado
izquierdo de una producción apropiada, siempre y cuando la reducción
corresponda a un paso en la reducción por la izquierda de la cadena de
símbolos inicial de la gramática.
146
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Uso de la pila
El procesamiento de una frase que emplea reducciones por la izquierda
puede realizarse con una pila.
entrada pila
0 x+y-x
1 x+y-x x Pasa x a la pila
2 +y-x FACTOR x se reduce a FACTOR
3 +y-x TERM FACTOR se reduce a TERM
4 +y-x EXPR TERM se reduce a EXPR
5 y-x EXPR + Pasa + a la pila
6 -x EXPR + y Pasa y a la pila
7 -x EXPR + FACTOR y se reduce a FACTOR
8 -x EXPR + TERM FACTOR se reduce a TERM
9 -x EXPR EXPR+TERM se reduce a EXPR
10 x EXPR - Pasa - a la pila
11 EXPR – x Pasa x a la pila
12 EXPR – FACTOR x se reduce a FACTOR
13 EXPR- TERM FACTOR se reduce a TERM
14 EXPR EXPR-TERM se reduce a EXPR
147
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
La reducción por la izquierda de la cadena “x1, x2, x3: integer” sería como sigue:
148
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
REPEAT
IF mando_en_cima_de_pila THEN
Reducir (* reemplazar cima de pila por lado
izquierdo de una prod.*)
ELSE
Desplazar (* colocar en la pila el siguiente símbolo
de entrada *)
END
UNTIL entrada_vacia AND NoHayMandosEnCimaDePila
IF axioma_en_cima_pila THEN
Aceptar (* la entrada es sintácticamente correcta *)
ELSE
Rechazar (* la entrada es sintácticamente incorrecta *)
END;
Figura 6.32. Algoritmo para el análisis sintáctico por desplazamiento y reducción
149
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
150
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Entrada
a + b - a * b $
Pila
Sk
Xk
sk- 1 Tabla de análisis sintáctico
Programa
xk -1 de análisis
acción Ir_a
:
:
S0
Desplazar :
El siguiente símbolo de entrada se desplazará a la pila
Reducir:
Se reduce cuando se reconoce un mando. Dependiendo del símbolo y del
estado vigente, se coloca un nuevo estado en la cima de la pila.
Aceptar:
Se aceptará la entrada cuando se detecte el final de la entrada $
151
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Análisis sintáctico LR
- Si A(sk, tm) es un estado si (es decir, desplazar si) de la pila, entonces al
examinar el símbolo tm en el estado sk, se meterá tm a la pila y después el
estado si se colocará en la cima de la pila.
- Si A(sk, tm) es una producción (es decir, con la producción pi) de la
gramática (X→α), entonces al examinar un símbolo tm en el estado sk, se
reconocerá un mando (α) y se reducirá mediante la producción dada (se
efectuarán 2*(longitud mando) operaciones de desempilar); quedando un
estado sj en la cima de la pila. Después X es desplazado a la cima de la
pila y el nuevo estado en la cima de la pila se determinará consultando la
tabla ir_a(sj, X)
- Si A(sk, tm) es una aceptación, el proceso de análisis y la entrada es
correcta, o sea, se habrá aceptado.
- Si A(sk, tm) no contiene entrada, ha ocurrido un error de modo que la
entrada es incorrecta y no será aceptada.
152
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Desplazar
o transferir un terminal de la parte frontal de la entrada hasta la parte
superior de la pila
Reducir
una cadena α en la parte superior de la pila a un no terminal A, dada la
producción A →α
Tabla 6.6. Análisis sintáctico LR para la cadena x1, x2, x3: INTEGER$” usando la
gramática G8
153
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
6.8 Manejo de errores.
Un error de sintaxis se detecta cuando el analizador sintáctico espera un símbolo
que no corresponde al que se acaba de leer. Los analizadores sintácticos LL y LR
tienen la ventaja de que pueden detectar errores sintácticos lo más pronto posible,
es decir, se genera un mensaje de error en cuanto el símbolo analizado no sigue
la secuencia de los símbolos analizados hasta ese momento.
154
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
De acuerdo con Teufel, et al, 1993, existen varias estrategias para corregir
errores, una vez detectados, entre las principales estrategias de recuperación se
encuentran las siguientes:
Intenta recuperar el error una vez descubierto. En el caso anterior, por ejemplo,
podría haber sido lo suficientemente inteligente como para insertar el token ‘;’. Hay
que tener cuidado con este método, pues puede dar lugar a recuperaciones
infinitas.
La gramática se puede aumentar con las reglas que reconocen los errores más
comunes.
d) Corrección Global
Dada una secuencia completa de tokens a ser reconocida, si hay algún error por el
que no se puede reconocer, consiste en encontrar la secuencia completa más
parecida que sí se pueda reconocer. Es decir, el analizador sintáctico le pide toda
la secuencia de tokens al léxico, y lo que hace es devolver lo más parecido a la
cadena de entrada pero sin errores, así como el árbol que lo reconoce.
155
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
156
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
6.9 Generadores de analizadores sintácticos.
El análisis léxico facilita la tarea de reconocer los elementos de un lenguaje uno a
uno. El análisis sintáctico nos permitirá averiguar si un archivo de entrada
cualquiera respeta las reglas de una gramática concreta.
Las siglas del nombre YACC significan "Yet Another Compiler Compiler". YACC
genera un analizador sintáctico (la parte de un compilador que intenta darle
sentido a la entrada) basado en una gramática analítica escrita en una notación
BNF. YACC genera el código para el analizador sintáctico en el Lenguaje de
programación C. YACC es un programa informático muy común en los sistemas
UNIX. A partir de un archivo fuente en YACC, se genera un archivo fuente en C
que contiene el analizador sintáctico. Sin embargo, un analizador sintáctico de
YACC no puede funcionar por sí solo, sino que necesita un analizador léxico
externo para funcionar. Dicho de otra manera, el código fuente en C que genera
YACC contiene llamadas a una función yylex() que debe estar definida y debe
devolver el tipo de lexema encontrado. Además, es necesario incorporar también
una función yyerror(), que será invocada cuando el analizador sintáctico
encuentre un símbolo que no encaja en la gramática.
157
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Berkeley YACC, GNU BISON, MKS YACC y Abraxas YACC (una versión
actualizada de la versión original de AT&T que también es software libre como
parte del proyecto de OpenSolaris de Sun). Cada una ofrece mejoras leves y
características adicionales sobre el YACC original, pero el concepto ha seguido
siendo igual. YACC también se ha reescrito para otros lenguajes, incluyendo
Ratfor, EFL, ML, Ada, Java, y Limbo.
6.9.1. BISON (Programa generador de analizadores sintácticos de
propósito general perteneciente al proyecto GNU).
• Todas las gramáticas bien escritas para Yacc, funcionan en Bison sin
necesidad de ser modificadas. Cualquier persona que esté familiarizada con
YACC podría utilizar BISON sin problemas.
158
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
bison archivo-entrada
Opciones de BISON
BISON soporta las opciones tradicionales de una única letra y nombres de opción
mnemónicos largos. Los nombres de opción largos se indican con ‘—‘ en lugar
de ‘-‘. Las abreviaciones para los nombres de opción se permiten siempre que
sean únicas. Cuando una opción larga toma un argumento, como ‘--file-prefix’, se
conecta el nombre de la opción con el argumento con ‘=’.
Aquí hay una lista de opciones que puede utilizar con BISON, alfabetizadas por la
opción corta.
‘-b prefijo-archivo’
‘--file-prefix=prefijo’
Especifica un prefijo a ser usado por todos los nombres de archivo de salida
de BISON. Los nombres se eligen como si el archivo de entrada se
llamase `prefijo.c'.
‘-d’
‘—defines’
Escribe un archivo extra de salida conteniendo las definiciones de las
macros para los nombres de tipo de tokens definidos en la gramática y el
tipo de valor semántico YYSTYPE, además de unas cuantas declaraciones
de variables extern. Si el archivo de salida del analizador se
llama ‘name.c’ entonces este archivo se llama ‘name.h’. Este archivo de
salida es esencial si desea poner las definiciones de yylex en un archivo
fuente por separado, porque yylex necesita ser capaz de hacer referencia a
los códigos de tipo de token y las variables yylval.
‘-l’
‘--no-lines’
No pone ningún comando #line del preprocesador en el archivo del
analizador. Normalmente BISON los pone en el archivo del analizador de
159
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
160
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
%{
Declaraciones en C
%}
Declaraciones de Bison
%%
Reglas gramaticales
%%
Código C adicional
Figura 6.34. Estructura del Archivo para BISON.
De acuerdo con la Fig. 6.34, los ‘%%’, ‘%{‘y ‘%}’ son signos de puntuación que
aparecen en todo archivo de gramática de BISON para separar las secciones.
[Link]. Declaraciones en C.
161
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
resultado: componentes...
;
donde
resultado es el símbolo no terminal que describe esta regla y componentes son los
diversos símbolos terminales y no terminales que están reunidos por esta regla.
Por ejemplo:
Aquí se especifica que dos agrupaciones de tipo exp, con un token ‘+’ en medio,
puede combinarse en una agrupación mayor de tipo exp.
162
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Los espacios en blanco en las reglas son significativos únicamente para separar
símbolos. Puede añadir tantos espacios en blanco extra como desee.
{sentencias en C}
resultado: componentes-regla1...
| componentes-regla2...
...
;
Estas aún se consideran reglas distintas incluso cuando se unen de esa manera.
Si los componentes en una regla están vacíos, significa que resultado puede
concordar con la cadena vacía (en notación formal sería ε). Por ejemplo, aquí
aparece cómo definir una secuencia separada por comas de cero o más
agrupaciones exp:
expseq: /* vacío */
| expseq1
;
Es habitual escribir el comentario ‘/* vacío */’ en cada regla sin componentes.
expseq1: exp
| expseq1 ‘,’ exp
;
163
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Por ejemplo:
expr: primario
| primario ‘+’ primario
;
primario: constante
| ‘(‘ expr ‘)’
;
define dos no-terminales recursivos mutuamente, ya que cada uno hace referencia
al otro.
Semántica del lenguaje
En un programa sencillo podría ser suficiente con utilizar el mismo tipo de datos
para los valores semánticos de todas las construcciones del lenguaje. Por defecto
BISON utiliza el tipo int para todos los valores semánticos. Para especificar algún
otro tipo, defina YYSTYPE como una macro, de esta manera:
164
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
o Elegir uno de estos tipos para cada símbolo (terminal o no terminal). Esto se
hace para los tokens con la declaración de BISON %token y para los no
terminales con la declaración de BISON %type.
Acciones
Una acción acompaña a una regla sintáctica y contiene código C a ser ejecutado
cada vez que se reconoce una instancia de esa regla. La tarea de la mayoría de
las acciones es computar el valor semántico para la agrupación construida por la
regla a partir de los valores semánticos asociados a los tokens o agrupaciones
más pequeñas.
Una acción consiste en sentencias de C rodeadas por llaves, muy parecidas a las
sentencias compuestas en C. Se pueden situar en cualquier posición dentro de la
regla; la acción se ejecuta en esa posición.
El código C en una acción puede hacer referencia a los valores semánticos de los
componentes reconocidos por la regla con la construcción $n, que hace referencia
al valor de la componente n-ésima. El valor semántico para la agrupación que se
está construyendo es $$. Aquí hay un ejemplo típico:
exp: ...
| exp ‘+’ exp
{ $$ = $1 + $3; }
Esta regla construye una exp de dos agrupaciones exp más pequeñas
conectadas por un token de signo más. En la acción, $1 y $3 hacen referencia a
los valores semánticos de las dos agrupaciones exp componentes, que son el
primer y tercer símbolo en el lado derecho de la regla. La suma se almacena en $$
de manera que se convierte en el valor semántico de la expresión de adición
reconocida por la regla. Si hubiese un valor semántico útil asociado con el token
‘+’, debería hacerse referencia con $2.
Si no especifica una acción para una regla, BISON suministra una por defecto:
$$ = $1.
165
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
En este ejemplo:
exp: ...
| exp ‘+’ exp
{ $$ = $1 + $3; }
%union {
int tipoi;
double tipod;
}
El código fuente para esta calculadora se llama `rpcalc.y'. La extensión `.y' es una
convención utilizada para los archivos de entrada de Bison.
166
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
%{
#define YYSTYPE double
#include <math.h>
%}
%token NUM
167
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
input: /* vacío */
| input line
;
line: '\n'
| exp '\n' { printf ("\t%.10g\n", $1); }
;
La semántica del lenguaje se determina por las acciones que se toman cuando
una agrupación es reconocida. Las acciones son el código C que aparecen entre
llaves.
168
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
input: /* vacío */
| input line
;
Esta definición se interpreta así: "Una entrada completa es o una cadena vacía, o
una entrada completa seguida por una línea de entrada". Note que "entrada
completa" se define en sus propios términos. Se dice que esta definición
es recursiva por la izquierda ya que input aparece siempre como el símbolo más
a la izquierda en la secuencia.
La primera alternativa está vacía porque no hay símbolos entre los dos puntos y el
primer símbolo ‘|’; esto significa que input puede corresponder con una cadena de
entrada vacía (sin tokens). Escribimos estas reglas de esa manera porque es
legítimo escribir Ctrl-d después de arrancar la calculadora. Es clásico poner una
alternativa vacía al principio y escribir en esta el comentario '/* vacío */'’.
La segunda alternativa de la regla (input line) maneja toda la entrada no trivial. Esta
significa, "Después de leer cualquier número de líneas, leer una más si es
posible". La recursividad por la izquierda convierte esta regla en un ciclo. Ya que la
primera alternativa concuerda con la entrada vacía, el ciclo se puede ejecutar cero
o más veces.
line: '\n'
| exp '\n' { printf ("\t%.10g\n", $1); }
;
Esta acción es poco común porque no asigna un valor a $$. Como consecuencia,
el valor semántico asociado con line está sin inicializar (su valor será
impredecible). Se trataría de un error si ese valor se utilizara, pero nosotros no lo
169
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
utilizaremos: una vez que rpcalc haya imprimido el valor de la línea de entrada del
usuario, ese valor no se necesitará más.
La agrupación exp tiene varias reglas, una para cada tipo de expresión. La primera
regla maneja las expresiones más simples: aquellas que son solamente números.
La segunda maneja una expresión de adición, que tiene el aspecto de dos
expresiones seguidas de un signo más. La tercera maneja la resta, y así
sucesivamente.
exp: NUM
| exp exp '+' { $$ = $1 + $2; }
| exp exp '-' { $$ = $1 - $2; }
...
;
Se ha utilizado el símbolo `|' para unir las tres reglas de exp, pero igualmente se
podría haber escrito por separado:
exp: NUM ;
exp: exp exp '+' { $$ = $1 + $2; } ;
exp: exp exp '-' { $$ = $1 - $2; } ;
...
No se tiene que dar una acción para cada regla. Cuando una regla no tenga
acción, por defecto BISON copia el valor de $1 en $$. Esto es lo que sucede en la
primera regla (la que usa NUM).
170
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
Se devuelve un código de tipo de token igual a cero cuando se llega al final del
archivo. (BISON reconoce cualquier valor no positivo como indicador del final del
archivo de entrada.)
171
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
#include <ctype.h>
yylex ()
{
int c;
/* ignora los espacios en blanco */
while ((c = getchar ()) == ' ' || c == '\t')
;
/* procesa números */
if (c == '.' || isdigit (c))
{
ungetc (c, stdin);
scanf ("%lf", &yylval);
return NUM;
}
/* devuelve fin-de-fichero */
if (c == EOF)
return 0;
/* devuelve caracteres sencillos */
return c;
}
Figura 6.37 Código para el analizador léxico
La Función de Control
main ()
{
yyparse ();
}
172
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
#include <stdio.h>
Con todo el código fuente en un único archivo, utilice el siguiente comando para
convertirlo en el archivo del analizador:
bison nombre_archivo.y
% ls
[Link].c rpcalc.y
173
Instituto Tecnológico de Zacatepec. Ingeniería en Sistemas Computacionales. 2013.
Lenguajes y Autómatas I. M.C. Norma J. Ontiveros Hernández. njoh_314@[Link]
% ls
rpcalc [Link].c rpcalc.y
% rpcalc
49+
13
3 7 + 3 4 5 *+-
-13
37+345*+-n Note el menos unario, `n'
13
56/4n+
-3.166666667
34^ Exponenciación
81
^D Indicador de Fin-de-archivo
%
174