F -X C h a n ge
PD
F -X C h a n ge
O W !
bu
to
lic
lic
to
bu
22/09/2011
y N
O W !
.c
o
.d o
c u -tr a c k
.c
.d o
c u -tr a c k
COMPILADORES
Jorge Kashiwamoto
INTRODUCCIN
Tambin llamado TOP-DOWN El reconocimiento sintctico es
El proceso para determinar si una cadena de smbolos terminales (tokens) es una oracin del lenguaje.
Aplicacin
La aplicacin de un reconocimiento desde arriba, consiste en trminos generales de lo siguiente:
1. Partiendo del smbolo inicial distinguido, se aplican las reglas en algn orden, que por el momento podemos considerar al azar, hasta obtener una CADENA GENERADA consistente exclusivamente de smbolos terminales. 2. Se compara la cadena generada con la cadena dato; si son iguales, ha terminado el proceso con xito. 3. Si la comparacin falla, se procede a repetir el primer paso con objeto de generar otra de las oraciones del lenguaje y a compararla con la cadena dato.
El problema a resolver es determinar si una cadena de smbolos terminales (llamada CADENA DATO) puede generarse a partir de las producciones dadas.
w
w
w
w
PD
F -X C h a n ge
PD
F -X C h a n ge
O W !
bu
to
lic
lic
to
bu
22/09/2011
y N
O W !
.c
o
.d o
c u -tr a c k
.c
.d o
c u -tr a c k
Aplicacin
La generacin de oraciones no puede hacerse aplicando reglas al azar, ya que sera un proceso ineficiente, debido a que los lenguajes de programacin son infinitos. Es necesario seguir un orden preestablecido de tal modo que se logren dos objetivos:
Generar precisa o casi precisamente la cadena dato y Determinar cuanto antes si la cadena dato no puede ser parte del lenguaje, en cuyo caso se diagnostica un error.
Procedimiento
El reconocimiento desde abajo procede en general de la siguiente forma:
1. Se asigna la cadena dato a la cadena de comparacin X (X <cadena dato). 2. Se escogen las producciones en algn orden (que por el momento consideraremos al azar) y se comparan los consecuentes de cada produccin con subcadenas de X. 3. Si no existe ninguna subcadena de X igual a alguno de los consecuentes (lado derecho de una produccin), es necesario repetir el proceso a partir del paso 1. 4. Si existe una subcadena de X igual a algn consecuente, se sustituye la subcadena por el antecedente (lado izquierdo) de la produccin encontrada
Procedimiento
Si la cadena resultante de la sustitucin consiste
nicamente del smbolo inicial distinguido, el proceso ha terminado con xito En caso contrario se repiten los pasos 2, 3 y 4.
La seleccin de las producciones que han de compararse con la cadena dato ciertamente no puede ser al azar
Sino siguiendo un orden que permita asegurar si se han agotado o no todas las secuencias de sustitucin.
Algoritmo
En los mtodos de reconocimiento sintctico desde arriba se intenta producir la oracin que se desea reconocer, partiendo del smbolo inicial distinguido de la gramtica. El punto de partida es el conjunto de reglas cuyo antecedente comn es el smbolo inicial distinguido.
Top-Down Parsing
En BNF todas las reglas que tienen un mismo antecedente se describen con una sola regla de la forma:
<Z> ::= <X1> | <X2> | ... <Xn>
donde el lado izquierdo del '::=' es el antecedente comn y el lado derecho consiste de una secuencia de alternativas de sustitucin del smbolo Z.
Top-Down Parsing
Supongamos que Z es el smbolo inicial distinguido de la gramtica del lenguaje en cuestin; deseamos describir el procedimiento necesario para reconocer la oracin:
Y ::= Y1 Y2 ... Ym; Yi pertenece_a VT (1<=i<=m)
con la regla: <Z> ::= <X1> | <X2> | ... <Xn> donde Xi ::= Xi1 Xi2 Xi3 ... Xibi (b<=i<=n); Xi pertenece_a VN U VT
Se acostumbra hablar de las ALTERNATIVAS de la regla Z an cuando, estrictamente, cada alternativa es una regla de produccin diferente.
es decir, los smbolos Yi de la oracin que se desea reconocer son terminales y los smbolos de cada una de las alternativas se Z pueden ser o no terminales.
w
w
w
w
PD
F -X C h a n ge
PD
F -X C h a n ge
O W !
bu
to
lic
lic
to
bu
22/09/2011
y N
O W !
.c
o
.d o
c u -tr a c k
.c
.d o
c u -tr a c k
Top-Down Parsing
El anlisis desde arriba consiste bsicamente en:
1. Aplicar las reglas ordenadamente con objeto de poder determinar cuales han sido utilizadas en la derivacin y cuales faltan por aplicar. 2. Determinar si el smbolo terminal que puede producir un smbolo dado coincide con el siguiente smbolo de la cadena dato.
Representacin de Gramticas
Como una primera aproximacin, podemos pensar que
Cada regla de produccin sea representada en un rengln de un arreglo bidimensional Los smbolos de la regla estn almacenados en las columnas de ese rengln
Incluyendo adems un smbolo para indicar el fin de la alternativa (@), Otro para sealar el fin de la regla (#).
Normalmente el orden de aplicacin de las reglas es de izquierda a derecha, tanto al sustituir cada uno de los smbolos de una alternativa como en cuanto a la seleccin de alternativas.
Ejemplo
Representacin de la regla:
Z ::= X11 X12 X13 | X21 X22 X23 X24
X11
X12
X13
X21
X22
X23
X24
...
Ejemplo
Suponiendo que X13 es no terminal y que la regla:
X13 ::= Q1 | Q2 | ... | Ql
est almacenada en el rengln K+i El valor interno del smbolo X13 es K+i, que sirve para localizar inmediatamente la regla.
K X11 X12 X13 @ X21 X22 X23 X24 # ...
Ejercicio
Obtener la Representacin Interna de la gramtica G(EXP), cuyas reglas son:
<EXP> ::= <+-><OPD><EXPR> <EXPR> ::= <OP><OPD><EXPR> | <OPD> ::= <NOM><PPA> | <CONS> | (<EXP>) <OP> ::= + | - | * | / < +-> ::= + | -
K+i Q1
@ Q2
...
@ Ql
...
w
w
w
w
PD
F -X C h a n ge
PD
F -X C h a n ge
O W !
bu
to
lic
lic
to
bu
22/09/2011
y N
O W !
.c
o
.d o
c u -tr a c k
.c
.d o
c u -tr a c k
Observaciones
Los problemas de la representacin de gramtica discutida hasta aqu son
Al detectar fracaso en un smbolo se hace necesario recorrer la tabla desde el smbolo que caus el fracaso, hasta encontrar la representacin del '|' (@), que marca el fin de la alternativa actual y el principio de la siguiente El nmero de columnas de la matriz debe ser tal que quepa la mayor regla de la gramtica
Desperdicia espacio en todos los renglones que representan reglas ms cortas.
Observaciones
Requiere BNF Extendido
Eliminacin de s [] y {}
Se implanta cada Produccin como una rutina de cdigo Se emplea el propio Stack del Lenguaje
Llamado de Subrutinas o Procedimientos
PDRC: Regla 1
BNF
A::=B
PDRC: Regla 2
BNF
B::=a
Traduce a
void A(void) { B(); }
Traduce a
void B(void) { Expect(a); }
w
w
w
w
PD
F -X C h a n ge
PD
F -X C h a n ge
O W !
bu
to
lic
lic
to
bu
22/09/2011
y N
O W !
.c
o
.d o
c u -tr a c k
.c
.d o
c u -tr a c k
PDRC: Regla 3
BNF
A::= void ( ( ... ( }
1 2... n
PDRC: Regla 4
BNF
B::=[ ]
Traduce en
A(void) { 1); 2);
n);
Traduce a
Si T
void B(void) { if(CurrentToken( )) Expect( ) }
Traduce a
Si N
void B(void) { if(CurrentTokenIn First( )) Expect( ) }
Si
i i
T N
PDRC: Regla 5
BNF
B::={ }
Traduce a
Si T
Traduce a
Si N
void B(void) { while(CurrentTokenIn First( )) Expect( ) }
w
w
w
w