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 array [ nm puntopunto nm] of integer Analizar sintcticamente Descendente (smbolo 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(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. Token especiales: >,>=,<,<= Palabras clave: While de WhileFlag 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 Expr -> Expr + Trmino Correccin de recursin 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* Gramtica infijo corregida Expr -> Trmino Resto Resto -> + Expr | - Expr | nil Trmino -> 0 Trmino -> 1 Trmino -> 2 .... Trmino -> 9
Proyecto 1 Gramtica de nombres y direcciones de email Reglas semnticas Reconocedor-extractor de emails mejorado GetNextToken() Match() Anlizador descendente