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