análisis sintáctico

17
Análisis Sintáctico Determinar si una cadena puede ser generada

Upload: tricia

Post on 14-Jan-2016

48 views

Category:

Documents


0 download

DESCRIPTION

Análisis Sintáctico. Determinar si una cadena puede ser generada. Analizador sintáctico. ¿Es posible construír el árbol? Métodos: Descendente De la raíz a las hojas Popular y eficiente Ascendente De las hojas a la raíz Más gramáticas. Analizador descendente. Algoritmo - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Análisis Sintáctico

Análisis Sintáctico

Determinar si una cadena puede ser generada

Page 2: Análisis Sintáctico

Analizador sintáctico

• ¿Es posible construír el árbol?• Métodos:

– Descendente• De la raíz a las hojas• Popular y eficiente

– Ascendente• De las hojas a la raíz• Más gramáticas

Page 3: Análisis Sintáctico

Analizador descendente

• Algoritmo1. Seleccione una producción y construya

los hijos2. Encuentre el siguiente nodo (no

terminal)3. Si hay otro nodo aplicar recursivamente4. Si no hay más nodos

1. Si la cadena coincide entonces ACEPTAR2. Si no coincide, probar recursivamente

Page 4: Análisis Sintáctico

Ejemplo

• Gramática de tipos en Pascal

Tipo -> Simple | ^id |array [ Simple ] of Tipo

Simple -> integer | char |núm puntopunto núm

Page 5: Análisis Sintáctico

array [ núm puntopunto núm] of integer

Analizar sintácticamente

Page 6: Análisis Sintáctico

Descendente (símbolo 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()

EndEndTipo = Resu

End Function

Page 7: Análisis Sintáctico

Descendente (nodo)Function Simple()

Resu = Match(“integer”)If Not Resu Then

Resu = Match(“char”)If Not Resu Then

Resu = Match(“núm”)And Match(“puntopunto”)And Match(“núm”)

EndEndSimple = Resu

End Function

Page 8: Análisis Sintáctico

Match() - parea()Function Match(Valor)

Tmp = GetNextToken()If Tmp = Valor Then

Match = True/* Avanzar posición en entrada */

ElseMatch = False

End IfEnd Function

Page 9: Análisis Sintáctico

Match() simplificado

Function Match(Valor)Match = GetNextToken() = Valor

End Function

Ojo: queda pendiente avanzar la entrada

Page 10: Análisis Sintáctico

GetNextToken()

• Inteligente– Reconoce separadores:

• Espacio, fin de línea, tabuladores, etc.

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

Page 11: Análisis Sintáctico

Recursión Izquierda

Problema para análisis sintáctico

Page 12: Análisis Sintáctico

Gramática infijo

Expr -> Expr + TérminoExpr -> Expr - TérminoExpr -> TérminoTérmino -> 0Término -> 1Término -> 2....Término -> 9

Recursión izquierda

Page 13: Análisis Sintáctico

Análisis descendenteFunction Expr()

Resu = Expr() And Match(“+”) And Término()If Not Resu Then

Resu = Expr() And Match(“-”) And Término()

If Not Resu ThenResu = Término()

EndEndExpr = Resu

End Function

Page 14: Análisis Sintáctico

Recursión izquierda

• Ojo: no se puede cambiar la gramática

• Gramática iguales si árboles iguales

• NT -> NT t1 | t2– NT: No Terminal– t1, t2: terminales

• Expr -> Expr + Término

Page 15: Análisis Sintáctico

Corrección de recursión 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*

Page 16: Análisis Sintáctico

Gramática infijo corregida

Expr -> Término RestoResto -> + Expr | - Expr | nilTérmino -> 0Término -> 1Término -> 2....Término -> 9

Page 17: Análisis Sintáctico

Proyecto 1

• Gramática de nombres y direcciones de email

• Reglas semánticas• Reconocedor-extractor de emails

mejorado– GetNextToken()– Match()– Análizador descendente