Está en la página 1de 27

GRAMTICAS

PREDICTIVAS
SEBASTIAN FORERO
CARLOS MACHADO
JULIANA TORRES
ANLISIS PREDICTIVO
S if E then S else S
S begin S L
S print E
L end
L ; S L
E num = num
final int IF=1, THEN=2, ELSE=3, BEGIN=4, END=5, PRINT=6,
SEMI=7, NUM=8, EQ=9;
int tok = getToken();
void advance() {tok=getToken();}
void eat(int t) {if (tok==t) advance(); else error();}
void S() {switch(tok) {
case IF: eat(IF); E(); eat(THEN); S();
eat(ELSE); S(); break;
case BEGIN: eat(BEGIN); S(); L(); break;
case PRINT: eat(PRINT); E(); break;
default: error();
}}
void L() {switch(tok) {
case END: eat(END); break;
case SEMI: eat(SEMI); S(); L(); break;
default: error();
}}
void E() { eat(NUM); eat(EQ); eat(NUM); }
S E $
E E + T
E E T
E T
T T F
T T / F
T F
F id
F num
F ( E )
void S() { E(); eat(EOF); }
void E() {switch (tok) {
case ?: E(); eat(PLUS); T(); break;
case ?: E(); eat(MINUS); T(); break;
case ?: T(); break;
default: error();
}}
void T() {switch (tok) {
case ?: T(); eat(TIMES); F(); break;
case ?: T(); eat(DIV); F(); break;
case ?: F(); break;
default: error();
}}
CONJUNTOS PRIMEROS Y
SIGUIENTES
Z d
Z X Y Z
Y
Y c
X Y
X a
for each terminal symbol Z
FIRST[Z] {Z}
repeat
for each production X Y1Y2 Yk
if Y1 . . . Yk are all nullable (or if k = 0)
then nullable[X] true
for each i from 1 to k, each j from i + 1 to k
if Y1 Yi1 are all nullable (or if i = 1)
then FIRST[X] FIRST[X] FIRST[Yi ]
if Yi+1 Yk are all nullable (or if i = k)
then FOLLOW[Yi] FOLLOW[Yi] FOLLOW[X]
if Yi+1 Yj1 are all nullable (or if i + 1 = j )
then FOLLOW[Yi] FOLLOW[Yi] FIRST[Yj ]
ELIMINAR RECURSIN POR
IZQUIERDA
E E + T
E T


FACTORIZACION POR IZQUIERDA
S if E then S else S
S if E then S

S if E then S X
X
X else S

RECUPERACIN DE ERRORES
void T() {switch (tok) {
case ID:
case NUM:
case LPAREN: F(); Tprime(); break;
default: error!
}}
void Tprime() {switch (tok) {
case PLUS: break;
case TIMES: eat(TIMES); F(); Tprime(); break;
case EOF: break;
case RPAREN: break;
default: error!
}}
void T() {switch (tok) {
case ID:
case NUM:
case LPAREN: F(); Tprime(); break;
default: print("expected id, num, or left-paren");
}}
ANLISIS LR
Analizador sintctico
LR
Analizador SLR
Estados y tabla de anlisis sintctico
SLR()
Algoritmo:
Tabla Reducida
Analizador LALR
- Para Gramaticas Reales, Una tabla de anlisis LR(1) puede llegar a ser 100 veces mayor que una tabla SLR(1)


- Los analizadores LALR (Look-Ahead-Left-To-Rigth) Son una simplificacin de los LR(1), tienen un nmero de e
estados similar a los de LR(0) y SLR(1).
GENERADORES DE
ANALIZADORES SINTCTICOS
Un analizador sintctico (o parser)
es una de las partes de un
compilador que transforma su
entrada en un rbol de derivacin.
JAVACC
Es un generador de analizadores sintcticos
JavaCC genera analizadores descendentes (top-down)
JJTree, construye rboles de abajo hacia arriba (bottom-
up).

Producciones de la forma:
DIRECTIVAS DE PROCEDENCIA
Considere la expresin 9+5*2.

Hay dos posibles interpretaciones
de esta expresin: (9 + 5 ) *2 o
9+(5*2).
RECUPERACION DE ERRORES
cmo debe recuperarse el
analizador sintctico?
ESTRATEGIAS
Recuperacin en modo de pnico
Recuperacin a nivel de frase
Producciones de errores
Correccin global
GRACIAS


PREGUNTAS?

También podría gustarte