Академический Документы
Профессиональный Документы
Культура Документы
PROGRAMA FUENTE
ANALIZADOR
LEXICO
Dame el siguiente
siguiente
token
token ANALIZADOR
SINTACTICO
INTRODUCCION
La sintaxis suele especificarse a traves de una G.L.C.
CocKe-Younger-Kasami
Earley
Métodos ascendentes(botton-up) y descendentes
(top-down)
BOTTON-UP Y TOP-DOWN
Análisis
S
Análisis
Descendente Ascendente
SVn , w Vt*
(Top-down) (Botton-up)
w
CONDICIONES PARA UN TOP-DOWN
Las producciones de la G.L.C deben cumplir los
siguientes requisitos:
A Vn , i ( Vn Vt )*
Procedimiento S
Procedimiento A1
Procedimiento A2
Procedimientos
Procedimiento ERROR
adicionales
Procedimiento Léxico
ADR
Un procedimiento opera del siguiente modo
G=(Vn, Vt, P, E )
Vn={ E, T, F } Vt = { id, *, +, (, ) }
P= {
E E+T / T
T T*F / F
F ( E ) / id A A , ( Vn Vt ) * , A V
}
A A’ A , A’ Vn
A’ A’ | a , ( Vn Vt )
ADR
Se buscará primero eliminar la recursividad
G=(Vn, Vt, P, E )
Vn={ E, T, F } Vt = { id, *, +, (, ) }
P= {
E TR A A , ( Vn Vt ) * , A V
R +TR /
A A’ A , A’ Vn
T FG
G *FG / A’ A’ | a , ( Vn Vt )
F ( E ) / id
}
ADR
Tenemos tres procedimientos adicionales
ProcedimientoR()
si( e = ‘+’) entonces T FG
igual(‘+’)
Procedimiento F()
T() G *FG / case e
R()
finsi ‘(’ :igual(‘(’)
finR E()
F ( E ) / id igual(‘)’)
ProcedimientoT( ) ‘id’ :igual(‘id’)
F() otro
G() error()
ProcedimientoG()
finT fin-case
si( e = ‘*’ ) entonces
igual(‘*’) finF
F()
G()
finsi
finG
ANALISIS DE UNA
SECUENCIA CON ADR
El final de cadena se
indica por un carácter $
Secuencia a ser
id * id $ analizada
Programa principal
que llama al
Programa principal
analizador léxico y
eLexico() luego al analizador
E() sintáctico (E)
finprincipal
id * id $
ProcedimientoT()
otro
error()
id * id $
F() fin-case
G() finF
finT
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR
Procedimiento E() ProcedimientoG() ProcedimientoIgual(t)
T() si( e = ‘*’ ) si e = t
R() igual(‘*’) e lexico()
finE F() sino
G() error()
finsi Fin Igual
finG
ProcedimientoR()
si( e = ‘+’)
igual(‘+’)
T() Procedimiento F()
R() case e
finsi ‘(’ :igual(‘(’)
finR E()
igual(‘)’)
ProcedimientoT()
‘id’ :igual(‘id’)
otro
id * id $
F() error()
G() fin-case
finT finF
ADR ProcedimientoG()
si( e = ‘*’ )
ProcedimientoIgual(t)
si e = t
igual(‘*’) e lexico()
Procedimiento E() F() sino
T() G() error()
R() finsi Fin Igual
finE finG
ProcedimientoR()
Programa principal
si( e = ‘+’)
igual(‘+’) eLexico()
T() E()
R()
finsi Procedimiento F() finprincipal
finR case e
‘(’ :igual(‘(’)
E()
ProcedimientoT()
igual(‘)’)
‘id’ :igual(‘id’)
id * id $
F()
otro
G()
error()
finT
fin-case
finF
TERMINO EL
RECONOCIMIENTO
IMPLEMENTACION DEL ADR
#define cmp strcmp // reemplaza la función COMPARA
#define esn isdigit // reemplaza la función ES DÍGITO
#define esl isalpha // reemplaza la función ES LETRA
class AS{
char cad[100];
int p;
char *lex;
public:
// métodos que implican los Vn de la gramática G
void E(); void T(); void R(); void G(); void F();
void I(char *); // verifica el patrón de la gramática G
char *L(); // implementa el analizador léxico
void leer(); // captura una frase del lenguaje
void W(); // avisa de algun error
AS(){ p=0;} // puntero a cada símbolo de la frase
};
SCANNER DEL ADR
char *AS::L(){ // analizador léxico
char *t; int k=0,s=0;
t = new char[20];
for(int i=p; i<strlen(cad); i++)
if(cad[i]!=' '){ // caracter blanco formará un nuevo lexema
if( p==i && esl(cad[i])) s=1; // si es identificador
if(s){
if(esl(cad[i]) || esn(cad[i])); // si es letra o dígito
else return "sos"; // si no es lexema conocido
}
t[k]=cad[i];
k++;
}
else { p=i+1; break; } // apunta al próximo componente léxico
t[k]='\0';
if(s) return "id"; // retorna un identificador
else return t; // retorna otro tipo de lexema
}
METODOS DEL ADR
void AS::leer(){
cout<<"\n leer cadena: ";gets(cad);
lex=L(); Es el programa
E(); leido en una
} cadena
void AS::W(){
cout<<"\n error";
getch(); exit(0); }
Avisa de algun
error
METODOS DEL ADR
void AS::E(){ T(); R(); }
E TR
void AS::R(){
if (!cmp(lex,"+")){
I("+");
T(); R+TR /
R();
}
}
void AS::F(){
if(!cmp("(",lex)){ I("("); E(); I(")");
}
else if (!cmp(lex,"id")) I("id");
F ( E ) / id
else W();
}
main() {
AS p;
p.leer();
cout<<"\n perfecto";
getch();
}
DETALLE DE UN ADR
1. Para producciones de la forma A 1 / 2 /… / n
A 1 / 2 /… / n
DETALLE DE UN ADR
2. Para producciones A 1 2 … n
Procedimiento 1
Procedimiento 2
……………..
Procedimiento n
A 1 2 … n
3. Para producciones A A /
si entrada PRIMERO()
Procedimiento
Procedimiento A
finsi
AA/
DETALLE DE UN ADR
4. Para producciones A
Procedimiento
A
5. Para producciones A /
si entrada PRIMERO() A/
Procedimiento
Finsi
6. Para producciones A a, a Vt
si entrada = a
entrada lexico()
sino
error
A a, a Vt
finsi
ANALIZADOR DESCENDENTE
PREDICTIVO (ADP)
Es un analizador sintáctico que no es recursivo
TABLA DE ANALISIS
SINTACTICO (TAS)
CONSTRUCCION DE UN ADP
I. Hallar los conjuntos PRIMERO y SIGUIENTE
1. Si XVt PRIMERO(X) es { X}
2. Si X P se adiciona a PRIMERO(X)
3. Si X Vn y XY1 Y2 … Yk P colocar aVt en
PRIMERO(X) si, para alguna i , a esta en PRIMERO(Yi ) y
esta en todos los PRIMERO(Y1),…, PRIMERO(Yi -1) osea Y1 …
Yi -1 *
I.HALLAR LOS CONJUNTOS
Ejemplo 4
Encontrar los conjuntos PRIMEROS de los Vn
Dada G=(Vn, Vt, P, S)
TABLA I
Vn ={S, A, B} Vt ={ a,b,c}
P={ SIMBOLO PRIMERO
S ABc S a, b, c
A a,
A a /
B b,
B b /
}
I.HALLAR LOS CONJUNTOS
SIGUIENTE
S ABc S $
A b, c
A a /
B c
B b /
}
S ABc
A a /
B b /
} TAS
Vn TABLA DE SIMBOLOS
a b c
S S ABc S ABc S ABc
A A a A A
B B b B
ALGORITMO DE ANALISIS
Sim apunta al primer componente léxico de w$
Repetir
Sea X símbolo de la cima de la pila y a el símbolo apuntado por sim
si X Vt o $
si X = a
sacar X de la pila y avanzar sim
sino error
finsi
sino si M[ X, a] = X Y1 Y2 … Yk
sacar X de pila y meter Yk Yk-1 … Y1 con Yi en la cima
sino entrada
error
finsi
finsi X A
Hasta X = $
a. . . . . .$
:
pila : Sim
$
Vn TABLA DE SIMBOLOS
a b c
S S ABc S ABc S ABc RECONOCIMIENTO
A A a A A
B B b B
TAS
3 $ cBa abc$
4 $ cB bc$ B b
5 $ cb bc$
6 $c c$
G=(Vn, Vt, P, E )
Vn={ E, T, F } Vt = { id, *, +, (, ) }
P= {
E E+T / T
T T*F / F
F ( E ) / id
}
ADP
G=(Vn, Vt, P, E )
Vn={ E, T, F } Vt = { id, *, +, (, ) }
P= {
E E+T / T
T T*F / F
F ( E ) / id
}
G=(Vn, Vt, P, E )
TABLA III
Vn={ E, T, F } Vt = { id, *, +, (, ) } SIMBOLO PRIMERO SIGUIENTE
P= { E ( , id ),$
E TR R +, ),$
R +TR / T ( , id +, ) , $
T FG G *, +, ) , $
G *FG / F ( , id *, +, ) , $
F ( E ) / id
}
TABLA DE ANALISIS SINTACTICO
DEL ADP
SIMBOLO PRIMERO SIGUIENTE
G=(Vn, Vt, P, E )
E ( , id ),$
Vn={ E, T, F } Vt = { id, *, +, (, ) } R +, ),$
P= {
T ( , id +, ) , $
E TR
G *, +, ) , $
R +TR /
F ( , id *, +, ) , $
T FG
G *FG /
F ( E ) / id
} TAS
Vn SIMBOLOS DE ENTRADA
id + * ( ) $
E ETR ETR
R R+TR R R
T TFG TFG
G G G*FG G G
F Fid F(E)
Vn SIMBOLOS DE ENTRADA
id + * ( ) $
E ETR ETR
TAS
3 $ RGF id * id $ F id
4 $ RG id id * id $
5 $ RG * id $ G * FG
6 $ RGF* * id $
LL(K)
LL(K)
Lectura de los Número de símbolos
símbolos de entrada tomados en cada
de izquierda a lectura
derecha
M[1][0]="E";M[1][1]="RT";M[1][4]="RT";
M[2][0]="R";M[2][2]="RT+";M[2][5]="&";M[2][6]="&";
M[3][0]="T";M[3][1]="GF"; M[3][4]="GF";
M[4][0]="G";M[4][2]="&";M[4][3]="GF*";M[4][5]="&";M[4][6]="&";
M[5][0]="F";M[5][1]="i";M[5][4]=")E(";
}
IMPLEMENTACION id
PILA
G
boolean Terminal(String car){ R
for(int i=1; i< 7; i++)
if(M[0][i].equals(car)) return true;
return false;
$ fondo
}
}
} // FIN DE CLASE TABLA
IMPLEMENTACION
class PARSER{
TABLA t=new TABLA();
String pila[]=new String[100];
String ae; //guarda un simbolo de la cadena de entrada
int i; // indice de la pila
String cad; // guarda la cadena de entrada
int p; // posicion de un simbolo de la cadena de entrada a leer
int pos;
static String leer(String m){
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String cadena="";
System.out.println(m);
try{ cadena=br.readLine(); }
catch(IOException ioe) { }
return cadena;
}
b*(a+ b)
IMPLEMENTACION pos
b *( a + b ) $
String Lexico(){ // regresa un lexema
char caracter;
String tira=""; //int k=0;
boolean sw=false;
for(int i=p; i<cad.length(); i++)
if(cad.charAt(i)!=' '){
tira=tira+cad.charAt(i); // se rellena otra cadena
pos=i+1;
break;
}
caracter=tira.charAt(0);
if(Character.isLetter(caracter))
tira="i";
i * ( i + i )
return tira.trim();
}
String RetCad(){
String temp=""; int j,k=0;
b *( a + b ) $
for(j=p; j<cad.length(); j++){
temp=temp+cad.charAt(j); }
return temp;
}
String RetPila(){
String CadPila="";
a+b)$
for(int j=0; j<i; j++) CadPila=CadPila+pila[j];
return CadPila;
}
PILA
T
R $RT
$ fondo
IMPLEMENTACION
void sintactico(){ // analizador sintactico
String XX; String produccion=""; int pos=0;
do{
// se copian las cadenas retornadas en "ae" y "XX"
ae=Lexico(); XX=pila[i-1];
pos=RetPos();
if( t.Terminal(XX)) // retorna 1 si XX es terminal, sino 0
if(XX.equals(ae)) {
i=i-1; // se descuenta un simbolo de la pila
mover(pos); // se lee la cadena de entrada desde
// la posicion "pos"
}
else { System.out.println("1"); error();}
else
if (t.ExisteInterseccion(XX,ae)){
produccion=t.RetProduccion();
System.out.println("| "+RetPila()+" | "+RetCad()+" | "+XX+"-->"+produccion);
i = i -1; // se descuenta un simbolo de la pila
// si la produccion es & no se mete en la pila
if(!produccion.equals("&")) Empilar(produccion);
}
else {System.out.println("2");error();}
}while(!XX.equals("$"));
}
IMPLEMENTACION
public static void main(String arg[]){
PARSER p=new PARSER();
p.lectura();
System.out.println("\n analisis correcto");
}
} // FIN DE PARSER
LEER CADENA:
a*b
| $E | a * b $ | E-->RT
| $RT | a * b $ | T-->GF
| $RGF | a * b $ | F-->i
| $RG | * b $ | G-->GF*
| $RGF | b $ | F-->i
| $RG | $ | G-->&
| $R | $ | R-->&
analisis correcto
Process completed.
ADP
Ejemplo 7
while a {
while b { }
while c { }
}
while d { }
ADP G=(Vn, Vt, S, P)
Vn={ S, W, A}
Vt={while, {, }, id }
Gramática Se elimina la
P={
ambigüedad SWK
G=(Vn, Vt, S, P) KS /
Vn={ S, W, A} AS/
Vt={while, {, }, id } Wwhile id { A}
P={
SWS / W }
AS/
Wwhile id { A}
} G=(Vn, Vt, S, P)
Vn={ S, W, A}
Vt={while, {, }, id }
P={ Se eliminan
SWA producciones
AS/ redundantes
Wwhile id { A} la
}
CONJUNTOS
G=(Vn, Vt, S, P)
Vn={ S, W, A}
Vt={while, {, }, id }
P={
SWA
AS/
Wwhile id { A}
Vn PRIMERO SIGUIENTE
S while $ R1
W while $, while R3, R2
A while, $, } R3, R2
TABLA DE ANALISIS
SINTACTICO
CONJUNTOS
G=(Vn, Vt, S, P)
Vn={ S, W, A} Vn PRIMERO SIGUIENTE
Vt={while, {, }, id } S while $
P={
SWA
AS/ W while $, while
Wwhile id { A} A while, $, }
TAS
Vn while $ }
S SWA
W Wwhile id { A}
A AS A A
PRUEBA DEL ANALIZADOR
G=(Vn, Vt, S, P)
Vn={ S, W, A}
Vt={while, {, }, id } S
P={
SWA
AS/ WA
Wwhile id { A}
}
while id { A}
while b { while c{ } }
S
WA
while id { A}
PRUEBA DEL ANALIZADOR
G=(Vn, Vt, S, P)
Vn={ S, W, A} PILA SECUENCIA PRODUCCION
Vt={while, {, }, id } $S while b{while c{}} $ SWA
G es LL $A}AW
$A}A}A{id while
while c{}} $
while c{}} $
Wwhile id {A}
TAS
$A}A}A{id c{}} $
Vn while $ } $A}A}A{ {}} $
$A}A}A }} $ A
S SWA
$A}A} }} $
W Wwhile id { A}
$A}A }$ A
A AS A A $A} }$
$A $ A
$ $ SE ACEPTA
LABORATORIO
class Auto{ };
class B: public V{ int x; int m(float a); };
:
Luego impleméntelo en C++ o en java
Observación:
Enviar a zorroculto69@Hotmail.com