Академический Документы
Профессиональный Документы
Культура Документы
Determinar si una cadena puede ser generada Leonel Morales Daz leonel@ingenieriasimple.com
Copyright 2008 by Leonel Morales Daz Ingeniera Simple. Derechos reservados Disponible en: http://www.ingenieriasimple.com/compiladores
Analizador sintctico
Es posible construr el rbol? Mtodos:
Descendente
De la raz a las hojas Popular y eficiente
Ascendente
De las hojas a la raz Ms gramticas
Analizador descendente
Algoritmo
1. Seleccione una produccin y construya los hijos 2. Encuentre el siguiente nodo (no terminal) 3. Si hay otro nodo aplicar recursivamente 4. Si no hay ms nodos
1. Si la cadena coincide entonces ACEPTAR 2. Si no coincide, probar recursivamente
Ejemplo
Gramtica de tipos en Pascal
Tipo -> Simple | ^id | array [ Simple ] of Tipo Simple -> integer | char |
nm puntopunto nm
Analizar sintcticamente
Descendente (nodo)
Function Simple() Resu = Match(integer) If Not Resu Then Resu = Match(char) If Not Resu Then Resu = Match(nm) And Match(puntopunto) And Match(nm) End End Simple = Resu End Function
Match() - parea()
Function Match(Valor) Tmp = GetNextToken() If Tmp = Valor Then Match = True /* Avanzar posicin 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 lnea, tabuladores, etc.
Recursin Izquierda
Problema para anlisis sintctico
Gramtica infijo
Expr -> Expr + Trmino Expr -> Expr - Trmino Expr -> Trmino Trmino -> 0 Trmino -> 1 Trmino -> 2 .... Trmino -> 9
Recursin izquierda
Anlisis descendente
Function Expr() Resu = Expr() And Match(+) And Trmino() If Not Resu Then Resu = Expr() And Match(-) And Trmino() If Not Resu Then Resu = Trmino() End End Expr = Resu End Function
Recursin izquierda
Ojo: no se puede cambiar la gramtica Gramtica iguales si rboles iguales NT -> NT t1 | t2
NT: No Terminal t1, t2: terminales
Proyecto 1
Gramtica de nombres y direcciones de email Reglas semnticas Reconocedor-extractor de emails mejorado
GetNextToken() Match() Anlizador descendente