tipos de análisis sintáctico
Transcripción
tipos de análisis sintáctico
TIPOS DE ANÁLISIS SINTÁCTICO M.C. Yolanda Moyao martínez Análisis descendente Partimos de la raíz del árbol y se van aplicando reglas por la izquierda de forma que se obtiene una derivación por la izquierda de la entrada. Recorriendo el árbol de A.S resultante, en profundidad de izquierda a derecha, encontraremos los tokens que devuelve el A.S en ese mismo orden. Análisis ascendente Partiendo de la cadena de entrada, se construye el árbol de A.S empezando por las hojas (donde están los tokens) y se van creando nodos intermedios hasta llegar a la raíz o axioma. Analizador Sintáctico Descendente Predictivo (ASDP) Para que el algoritmo tenga una complejidad lineal, el analizador debe realizar una predicción de la regla a aplicar. Se debe conocer el token de la entrada, a, que esté siendo analizado, y el N a expandir A, cuál de las alternativas de producción A α1 | α2 | … αn es la única posible que da lugar a que el resto de la cadena que se está analizando empiece por a. Ejemplo Sent if Expres then Sent Q | while Expres do Sent | begin Sent end. Gramáticas LL(1) LL ( 1 ) Análisis de izquierda a derecha para la cadena de entrada Derivación por la izquierda Basta con solo ver un token. Conjuntos de predicción Son conjuntos de tokens que ayudan a predecir qué regla se debe aplicar para la variable que hay que derivar. Se construyen, a partir de los símbolos de la parte derecha de las producciones de la G. Cálculo del conjunto de PRIMEROS La función PRIMEROS se aplica a cadenas de símbolos de la gramática α (T N)* y devuelve un conjunto que puede contener cualesquiera T de la gramática y puede contener a la cadena vacía . Definición Si α es una forma sentencial compuesta por una concatenación de símbolos, PRIMEROS (α) es el conjunto de T ó que pueden aparecer iniciando las cadenas que pueden derivar (en 0 o más pasos) de α . Definición formal: a PRIMEROS(α) si a ( T { } ) / α * aβ para alguna tira β Algoritmo 1. Si T, PRIMEROS () = {} 2. Si N: Inicialmente, PRIMEROS () = Si aparece la producción PRIMEROS () = PRIMEROS () {} Si a1 a2 ... an entonces PRIMEROS() = PRIMEROS() PRIMEROS(a1 a2 ...an) y para el cálculo de PRIMEROS(a1 a2 ... an) pueden darse dos casos: a) Si PRIMEROS(a1) entonces PRIMEROS() = PRIMEROS() PRIMEROS(a1) b) Si PRIMEROS(a1) entonces PRIMEROS() = PRIMEROS() ( PRIMEROS(a1) - {}) PRIMEROS(a2...an) y de nuevo pueden darse estos dos casos para PRIMEROS(a2 ... an) y siguientes, hasta an. Si "i, PRIMEROS(ai) entonces PRIMEROS() = PRIMEROS() {} 3. Para recoger todos los casos posibles habría que considerar que Si 1 | 2 | ... | n entonces PRIMEROS () = PRIMEROS(i) Ejemplo 1 E T E’ E’ + T E’ T F T’ T’ F T’ F ( E ) ident Calcular el conjunto de PRIMEROS Primeros PRIMEROS(E’) = { + , } PRIMEROS(T’) = { * , } PRIMEROS(T) = { ( , ident } PRIMEROS(F) = { ( , ident } PRIMEROS(E) = { ( , ident }