Está en la página 1de 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

También podría gustarte