Anda di halaman 1dari 5

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

COMPILADORES
Jorge Kashiwamoto

TIPOS DE ANLISIS SINTCTICO


Jorge Kashiwamoto

Tipos de Anlisis Sintctico


Top-Down (De Arriba hacia Abajo)
Gramtica Recursiva por Tabla Descendencia Recursiva por Cdigo Reconocimiento Predictivo LL(1)

Bottom-Up (De Abajo hacia Arriba)


LR(k) Cannico (ms poderoso) SLR (Sustituye de la parte extrema derecha) LALR (ms poderoso con tablas ms pequeas que SLR) Precedencia de Operadores
9/22/2011 3

ANLISIS SINTCTICO DESDE ARRIBA


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.

Los mtodos formales de anlisis sintctico se agrupan en dos grandes clases:


Reconocimiento "desde arriba" ("Top-Down"), y Reconocimiento "desde abajo" ("Bottom-Up").

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.

RECONOCIMIENTO SINTACTICO DESDE ARRIBA.


Los algoritmos de reconocimiento generalmente se caracterizan por
Una tabla de reconocimiento
Descripcin de la gramtica

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

La bsqueda de consecuentes a lo largo de toda la cadena dato sera sumamente ineficiente.

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

Descendencia recursiva por matriz


Es necesario poder distinguir los terminales de los no terminales
Para lo cual se eligen rangos de valores distintos para representar smbolos de los diferentes alfabetos. Adems, es necesario que los no terminales indiquen la localizacin, en la tabla, de la regla de sustitucin que los describe
Se logra fcilmente escogiendo como representacin interna de los no terminales el valor del ndice del arreglo que contiene los smbolos de la regla correspondiente.

que est almacenada en el rengln K de una matriz


1

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.

PARSER DE DESCENDENCIA RECURSIVA POR CDIGO Jorge Kashiwamoto

Descedencia Recursiva por Cdigo


PDRC
Parser de Descedencia Recursiva por Cdigo

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

Utilizacin de las funciones


Expect CurrentToken CurrentTokenInFirst

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

( i) = Expect( i); ( i) = i();

PDRC: Regla 5
BNF
B::={ }

Traduce a
Si T

Traduce a
Si N
void B(void) { while(CurrentTokenIn First( )) Expect( ) }

void B(void) { while(CurrentToken( )) Expect( ) }

w
w

w
w

Anda mungkin juga menyukai