Вы находитесь на странице: 1из 17

Anlisis Sintctico

Determinar si una cadena puede ser generada Leonel Morales Daz leonel@ingenieriasimple.com
Copyright 2008 by Leonel Morales Daz Ingeniera Simple. Derechos reservados Disponible en: http://www.ingenieriasimple.com/compiladores

Analizador sintctico
Es posible construr el rbol? Mtodos:
Descendente
De la raz a las hojas Popular y eficiente

Ascendente
De las hojas a la raz Ms gramticas

Analizador descendente
Algoritmo
1. Seleccione una produccin y construya los hijos 2. Encuentre el siguiente nodo (no terminal) 3. Si hay otro nodo aplicar recursivamente 4. Si no hay ms nodos
1. Si la cadena coincide entonces ACEPTAR 2. Si no coincide, probar recursivamente

Ejemplo
Gramtica de tipos en Pascal

Tipo -> Simple | ^id | array [ Simple ] of Tipo Simple -> integer | char |
nm puntopunto nm

array [ nm puntopunto nm] of integer

Analizar sintcticamente

Descendente (smbolo inicial)


Function Tipo() Resu = Simple() If Not Resu Then Resu = Match(^) And Match(id) If Not Resu Then Resu = Match(Array) And Match([) And Simple() And Match(]) And Match(of) And Tipo() End End Tipo = Resu End Function

Descendente (nodo)
Function Simple() Resu = Match(integer) If Not Resu Then Resu = Match(char) If Not Resu Then Resu = Match(nm) And Match(puntopunto) And Match(nm) End End Simple = Resu End Function

Match() - parea()
Function Match(Valor) Tmp = GetNextToken() If Tmp = Valor Then Match = True /* Avanzar posicin en entrada */ Else Match = False End If End Function

Match() simplificado
Function Match(Valor) Match = GetNextToken() = Valor End Function
Ojo: queda pendiente avanzar la entrada

GetNextToken()
Inteligente
Reconoce separadores:
Espacio, fin de lnea, tabuladores, etc.

Token especiales: >,>=,<,<= Palabras clave: While de WhileFlag

Recursin Izquierda
Problema para anlisis sintctico

Gramtica infijo
Expr -> Expr + Trmino Expr -> Expr - Trmino Expr -> Trmino Trmino -> 0 Trmino -> 1 Trmino -> 2 .... Trmino -> 9

Recursin izquierda

Anlisis descendente
Function Expr() Resu = Expr() And Match(+) And Trmino() If Not Resu Then Resu = Expr() And Match(-) And Trmino() If Not Resu Then Resu = Trmino() End End Expr = Resu End Function

Recursin izquierda
Ojo: no se puede cambiar la gramtica Gramtica iguales si rboles iguales NT -> NT t1 | t2
NT: No Terminal t1, t2: terminales

Expr -> Expr + Trmino

Correccin de recursin izquierda


NT -> NT t1 | t2
t2 t1 t1 t1 ... t1 t2 t1*

NT -> t2 R R -> t1 R | nil


t2 t1 t1 t1 ... t1 t2 t1*

Gramtica infijo corregida


Expr -> Trmino Resto Resto -> + Expr | - Expr | nil Trmino -> 0 Trmino -> 1 Trmino -> 2 .... Trmino -> 9

Proyecto 1
Gramtica de nombres y direcciones de email Reglas semnticas Reconocedor-extractor de emails mejorado
GetNextToken() Match() Anlizador descendente

Вам также может понравиться