Está en la página 1de 7

TEMA 3: ANALIZADOR SINTCTICO

Compiladores e Intrpretes

ndice

Funcin del analizador sintctico y tipos Anlisis descendente


Descendente recursivo Predictivo rercursivo y no recursivo Ascendente Por precedencia de operadores LR

Anlisis ascendente

Utilizacin de generadores de analizadores sintctico: Yacc Tratamiento de errores Creacin de rboles sintncticos
Compiladores e Intrpretes 2

Papel del analizador sintctico


Se encarga de obtener una cadena de tokens comprueba si la cadena puede ser generada por la gramtica del lenguaje fuente. Detecta errores e informa de ellos. Se recupera ante los errores para continuar compilando.
Compiladores e Intrpretes 3

Papel del analizador sintctico

Del libro Compiladores. Principios, tcnicas y herramientas del autor Aho.

Compiladores e Intrpretes

Mtodos universales de anlisis sintctico: algoritmo de Cocke-Younger-Kasami y el de Earley. Pueden analizar cualquier gramtica pero son muy ineficientes. Analizadores sintcticos descendentes: construyen el rbol de anlisis sintctico desde la raz hacia las hojas (subclases de gramticas como LL) Analizadores sintcticos ascendentes: construyen el rbol de anlisis sintctico desde las hojas hasta la raz (subclases de gramticas como LR). Compiladores e Intrpretes 5

TIPOS DE ANALIZADORES SINTCTICOS

Analizador sintctico descendente


Construyen el rbol buscando derivaciones a la izquierda hasta que concuerde con la entrada. Los no terminales son procedimientos y los terminales son lecturas de la entrada. La parte derecha de un produccin propone la secuencia de llamadas a procedimientos y lecturas.
Compiladores e Intrpretes 6

Analizador sintctico descendente


Tipos de analizadores descendentes Anlisis sintctico por descenso recursivo:

Puede realizar retrocesos: analizar varias veces la entrada hasta encontrar las derivaciones correctas.
Ej.: S cAd A ab|a Entrada: cad

Compiladores e Intrpretes

Analizador sintctico descendente


Tipos de analizadores descendentes Analizadores sintcticos predictivos:

Gramticas sin recursin por la izquierda y factorizada por la izquierda analizador descendente sin retroceso. Si hay ambigedad no puedo aplicarlo De la gramtica se extrae le diagrama de transiciones. Ej. F: ( E ) Segn implementacin del diagrama: Dos tipos:

A. S. P. Recursivos: mediante llamadas recursivas A. S. P. no recursivo: Con pila


Compiladores e Intrpretes

Analizador sintctico descendente


Analizador sintctico predictivo no recursivo
La tabla: M[A,a] parte de la derecha de una produccin X es la cima de la pila a es el carcter de entrada:

si X=a=$ aceptada la entrada. Si X=a saca X de la pila y avanza el puntero entrada. Si X es un no terminal saca X de la pila y apila M[X,a] (apila WVU (U en la cima)/ X UVW). Si en M[X,a] =error se llama a una rutina de recuperacin de error.
Compiladores e Intrpretes 9

Analizador sintctico descendente


Construccin de la tabla de anlisis sintctico PRIMERO(),, siendo a una cadena de G = terminales que comienzan las cadenas derivadas de (incluido si la produce) SIGUIENTE(A),, A es NT de G= terminales que pueden aparecer inmediatamente a la dereca de A en cualquier frase sentencial (S * Aa (a)). Si A es el ltimo meter $. Tabla: en M[A,a]= Aa si en Primero(A) est a. Si est utilizo sus Siguiente.
Compiladores e Intrpretes 10

Analizador sintctico descendente


Gramtica de if then else: PiEtPP|a PiEtP|iEtPeP|a P eP| Eb E b a P P E E b Pa PeP P b e Siguiente(P)=siguiente(P) ={$,Primero(P)}={$,e} i P iEtPP P t $

Compiladores e Intrpretes

11

Analizador sintctico descendente


Gramtica de if then else: PiEtPP|a PiEtP|iEtPeP|a P eP| Eb E b a b P P E E b Pa PeP P Siguiente(P)=siguiente(P) ={$,Primero(P)}={$,e} e i P iEtPP P t $

Gramticas ambiguas generan tablas con entradas conflictivas: necesario gramticas LL(1)
Compiladores e Intrpretes 12

Analizador sintctico descendente


Gramticas LL(1)

La primera L (left): anlisis de izquierda a derecha. La segunda L: derivacin por la izquierda. Un smbolo de anticipacin.

En general una G para ser LL(1), deben verificar que A | :


Para ningn terminal a, ni ni deben derivar en una cadena que comience con a. Como mucho solo una de las dos ( o ) pueden derivar en palabra vaca. Si deriva en varias derivaciones en la palabra vaca, entonces no debe derivar ninguna cadena que comience con un terminal en SIGUIENTE(A).
Compiladores e Intrpretes 13

También podría gustarte