170 likes | 292 Views
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
E N D
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 • Seleccione una producción y construya los hijos • Encuentre el siguiente nodo (no terminal) • Si hay otro nodo aplicar recursivamente • Si no hay más nodos • Si la cadena coincide entonces ACEPTAR • 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() 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(“núm”) And Match(“puntopunto”) And Match(“núm”) End End Simple = Resu End Function
Match() - parea() Function Match(Valor) Tmp = GetNextToken() If Tmp = Valor Then Match = True /* Avanzar posición 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 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érmino Expr -> Expr - Término Expr -> Término Término -> 0 Término -> 1 Término -> 2 .... Término -> 9 Recursión izquierda
Análisis descendente Function Expr() Resu = Expr() And Match(“+”) And Término() If Not Resu Then Resu = Expr() And Match(“-”) And Término() If Not Resu Then Resu = Término() End End Expr = 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 Resto Resto -> + Expr | - Expr | nil Término -> 0 Término -> 1 Té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