Análisis Sintáctico
description
Transcript of Análisis Sintáctico
![Page 1: Análisis Sintáctico](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/1.jpg)
Análisis Sintáctico
Determinar si una cadena puede ser generada
![Page 2: Análisis Sintáctico](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/2.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/3.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/4.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/5.jpg)
array [ núm puntopunto núm] of integer
Analizar sintácticamente
![Page 6: Análisis Sintáctico](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/6.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/7.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/8.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/9.jpg)
Match() simplificado
Function Match(Valor)Match = GetNextToken() = Valor
End Function
Ojo: queda pendiente avanzar la entrada
![Page 10: Análisis Sintáctico](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/10.jpg)
GetNextToken()
• Inteligente– Reconoce separadores:
• Espacio, fin de línea, tabuladores, etc.
– Token especiales: >,>=,<,<=– Palabras clave: While de WhileFlag
![Page 11: Análisis Sintáctico](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/11.jpg)
Recursión Izquierda
Problema para análisis sintáctico
![Page 12: Análisis Sintáctico](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/12.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/13.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/14.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/15.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/16.jpg)
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](https://reader035.fdocuments.es/reader035/viewer/2022072108/568148b8550346895db5d1d8/html5/thumbnails/17.jpg)
Proyecto 1
• Gramática de nombres y direcciones de email
• Reglas semánticas• Reconocedor-extractor de emails
mejorado– GetNextToken()– Match()– Análizador descendente