PD

F -X C h a n ge

PD

F -X C h a n ge

O W !

bu

to

k

lic

C

m

C

lic

k

to

bu

22/09/2011
y N

y

N

O W !
.c
o

w

.d o

c u -tr a c k

.c

w

o

.d o

c u -tr a c k

COMPILADORES
Jorge Kashiwamoto

TIPOS DE ANÁLISIS SINTÁCTICO
Jorge Kashiwamoto

Tipos de Análisis Sintáctico
• Top-Down (De Arriba hacia Abajo)
– Gramática Recursiva por Tabla – Descendencia Recursiva por Código – Reconocimiento Predictivo LL(1)

• Bottom-Up (De Abajo hacia Arriba)
– LR(k) Canónico (más poderoso) – SLR (Sustituye de la parte extrema derecha) – LALR (más poderoso con tablas más pequeñas que SLR) – Precedencia de Operadores
9/22/2011 3

ANÁLISIS SINTÁCTICO DESDE ARRIBA
Jorge Kashiwamoto

INTRODUCCIÓN
• También llamado TOP-DOWN • El reconocimiento sintáctico es
– El proceso para determinar si una cadena de símbolos terminales (tokens) es una oración del lenguaje.

Aplicación
• La aplicación de un reconocimiento desde arriba, consiste en términos generales de lo siguiente:
– 1. Partiendo del símbolo inicial distinguido, se aplican las reglas en algún orden, que por el momento podemos considerar al azar, hasta obtener una CADENA GENERADA consistente exclusivamente de símbolos terminales. – 2. Se compara la cadena generada con la cadena dato; si son iguales, ha terminado el proceso con éxito. – 3. Si la comparación 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 métodos formales de análisis sintáctico 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 símbolos terminales (llamada CADENA DATO) puede generarse a partir de las producciones dadas.

1

m

w
w

w
w

Yi pertenece_a VT (1<=i<=m) • con la regla: • <Z> ::= <X1> | <X2> | . Si no existe ninguna subcadena de X igual a alguno de los consecuentes (lado derecho de una producción). Xibi (b<=i<=n). 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> | . – 4.. Se asigna la cadena dato a la cadena de comparación X (X <cadena dato).PD F -X C h a n ge PD F -X C h a n ge O W ! bu to k lic C m C lic k to bu 22/09/2011 y N y N O W ! ..d o c u -tr a c k . 2 m w w w w ... en cuyo caso se diagnostica un error. – Algoritmo • La búsqueda de consecuentes a lo largo de toda la cadena dato sería sumamente ineficiente. se sustituye la subcadena por el antecedente (lado izquierdo) de la producción encontrada Procedimiento • Si la cadena resultante de la sustitución consiste – Únicamente del símbolo inicial distinguido. <Xn> • donde el lado izquierdo del '::=' es el antecedente común y el lado derecho consiste de una secuencia de alternativas de sustitución del símbolo Z. <Xn> • donde Xi ::= Xi1 Xi2 Xi3 . partiendo del símbolo inicial distinguido de la gramática. Xi pertenece_a VN U VT • Se acostumbra hablar de las ALTERNATIVAS de la regla Z aún cuando. deseamos describir el procedimiento necesario para reconocer la oración: – Y ::= Y1 Y2 . debido a que los lenguajes de programación son infinitos. cada alternativa es una regla de producción diferente. – 3. Ym.. Procedimiento • El reconocimiento desde abajo procede en general de la siguiente forma: – 1. los símbolos Yi de la oración que se desea reconocer son terminales y los símbolos de cada una de las alternativas se Z pueden ser o no terminales.d o c u -tr a c k Aplicación • La generación de oraciones no puede hacerse aplicando reglas al azar. estrictamente. Top-Down Parsing • Supongamos que Z es el símbolo inicial distinguido de la gramática del lenguaje en cuestión. es necesario repetir el proceso a partir del paso 1. – 2. • El punto de partida es el conjunto de reglas cuyo antecedente común es el símbolo inicial distinguido. – es decir.c w o . • Los algoritmos de reconocimiento generalmente se caracterizan por – Una tabla de reconocimiento • Descripción de la gramática • La selección 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 sustitución.. Se escogen las producciones en algún orden (que por el momento consideraremos al azar) y se comparan los consecuentes de cada producción con subcadenas de X. • 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. el proceso ha terminado con éxito – En caso contrario se repiten los pasos 2. ya que sería un proceso ineficiente. Si existe una subcadena de X igual a algún consecuente.c o w . • En los métodos de reconocimiento sintáctico desde arriba se intenta producir la oración que se desea reconocer. 3 y 4... RECONOCIMIENTO SINTACTICO DESDE ARRIBA.

| * | / – < +-> ::= + | - K+i Q1 @ Q2 @ . Ejemplo • Suponiendo que X13 es no terminal y que la regla: – X13 ::= Q1 | Q2 | ...d o c u -tr a c k . cuyas reglas son: – <EXP> ::= <+-><OPD><EXPR> – <EXPR> ::= <OP><OPD><EXPR> | – <OPD> ::= <NOM><PPA> | <CONS> | (<EXP>) – <OP> ::= + | .c w o . es necesario que los no terminales indiquen la localización. | Ql • está almacenada en el renglón K+i • El valor interno del símbolo X13 es K+i. @ Ql .. Ejercicio • Obtener la Representaciòn Interna de la gramática G(EXP). podemos pensar que – Cada regla de producción sea representada en un renglón de un arreglo bidimensional – Los símbolos de la regla estén almacenados en las columnas de ese renglón • Incluyendo además un símbolo para indicar el fin de la alternativa (@). K X11 X12 X13 @ X21 X22 X23 X24 # .PD F -X C h a n ge PD F -X C h a n ge O W ! bu to k lic C m C lic k to bu 22/09/2011 y N y N O W ! . • Normalmente el orden de aplicación de las reglas es de izquierda a derecha.. Determinar si el símbolo terminal que puede producir un símbolo dado coincide con el siguiente símbolo de la cadena dato. Ejemplo • Representación 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 símbolos de los diferentes alfabetos. • Otro para señalar el fin de la regla (#). tanto al sustituir cada uno de los símbolos de una alternativa como en cuanto a la selección de alternativas. Aplicar las reglas ordenadamente con objeto de poder determinar cuales han sido utilizadas en la derivación y cuales faltan por aplicar.c o w .. de la regla de sustitución que los describe • Se logra fácilmente escogiendo como representación interna de los no terminales el valor del índice del arreglo que contiene los símbolos de la regla correspondiente. Representación de Gramáticas • Como una primera aproximación. en la tabla.d o c u -tr a c k Top-Down Parsing • El análisis desde arriba consiste básicamente en: – 1... – 2. que sirve para localizar inmediatamente la regla. – Además... • que está almacenada en el renglón K de una matriz 1 K X11 X12 X13 @ X21 X22 X23 X24 # .. 3 m w w w w .

PD F -X C h a n ge PD F -X C h a n ge O W ! bu to k lic C m C lic k to bu 22/09/2011 y N y N O W ! . que marca el fin de la alternativa actual y el principio de la siguiente – El número de columnas de la matriz debe ser tal que quepa la mayor regla de la gramática • Desperdicia espacio en todos los renglones que representan reglas más cortas. PARSER DE DESCENDENCIA RECURSIVA POR CÓDIGO Jorge Kashiwamoto Descedencia Recursiva por Código • PDRC – Parser de Descedencia Recursiva por Código Observaciones • Requiere BNF Extendido – Eliminación de ’s – [] y {} • Se implanta cada Producción como una rutina de código • Se emplea el propio Stack del Lenguaje – Llamado de Subrutinas o Procedimientos • Utilización de las funciones – Expect – CurrentToken – CurrentTokenInFirst PDRC: Regla 1 • BNF – A::=B PDRC: Regla 2 • BNF – B::=a • Traduce a – void A(void) { B().c w o .d o c u -tr a c k . } • Traduce a – void B(void) { Expect(a). hasta encontrar la representación del '|' (@).c o w .d o c u -tr a c k Observaciones • Los problemas de la representación de gramática discutida hasta aquí son – Al detectar fracaso en un símbolo se hace necesario recorrer la tabla desde el símbolo que causó el fracaso. } 4 m w w w w .

d o c u -tr a c k PDRC: Regla 3 • BNF – A::= – void ( ( .. 2)..PD F -X C h a n ge PD F -X C h a n ge O W ! bu to k lic C m C lic k to bu 22/09/2011 y N y N O W ! ..d o c u -tr a c k . 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( ) } 5 m w w w w .c w o . ( i) = i(). n).c o w .. ( } 1 2. • 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). n PDRC: Regla 4 • BNF – B::=[ ] • Traduce en A(void) { 1).