análisis sintáctico

Post on 14-Jan-2016

58 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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

• 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

Ejemplo

• Gramática de tipos en Pascal

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

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

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

Analizar sintácticamente

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

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

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

Tmp = GetNextToken()If Tmp = Valor Then

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

ElseMatch = False

End IfEnd Function

Match() simplificado

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

End Function

Ojo: queda pendiente avanzar la entrada

GetNextToken()

• Inteligente– Reconoce separadores:

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

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

Recursión Izquierda

Problema para 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

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

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

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*

Gramática infijo corregida

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

Proyecto 1

• Gramática de nombres y direcciones de email

• Reglas semánticas• Reconocedor-extractor de emails

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

top related