Documente Academic
Documente Profesional
Documente Cultură
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
Mtodos ascendentes(botton-up) y descendentes
(top-down)
BOTTON-UP Y TOP-DOWN
S
Anlisis Anlisis
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 1 /2 /. /n
A Vn , i ( Vn Vt )*
Procedimiento S
Procedimiento A1
Procedimiento A2
Procedimiento ERROR Procedimientos
Procedimiento Lxico adicionales
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 /
T FG A A A , A Vn
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()
R()
G *FG / case e
finsi ( :igual(()
finR E()
F ( E ) / id igual())
ProcedimientoT( ) id :igual(id)
F() otro
G()
error()
finT ProcedimientoG()
si( e = * ) entonces fin-case
igual(*) finF
F()
G()
finsi
finG
ANALISIS DE UNA
SECUENCIA CON ADR
El final de cadena se
indica por un carcter $
Secuencia a ser
id * id $ analizada
Programa principal
que llama al
Programa principal
analizador lxico y
eLexico() luego al analizador
E() sintctico (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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
finsi case e
finR ( :igual(()
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()
finsi case e
finR ( :igual(()
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()
finsi case e
finR ( :igual(()
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()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
Fin Igual
finsi
finG
ProcedimientoR()
si( e = +)
igual(+)
T()
Procedimiento F()
R()
finsi case e
finR ( :igual(()
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()
si( e = +) Programa principal
igual(+)
eLexico()
T()
R() E()
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 funcin COMPARA
#define esn isdigit // reemplaza la funcin ES DGITO
#define esl isalpha // reemplaza la funcin ES LETRA
class AS{
char cad[100];
int p;
char *lex;
public:
// mtodos que implican los Vn de la gramtica G
void E(); void T(); void R(); void G(); void F();
void I(char *); // verifica el patrn de la gramtica G
char *L(); // implementa el analizador lxico
void leer(); // captura una frase del lenguaje
void W(); // avisa de algun error
AS(){ p=0;} // puntero a cada smbolo de la frase
};
SCANNER DEL ADR
char *AS::L(){ // analizador lxico
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 dgito
else return "sos"; // si no es lexema conocido
}
t[k]=cad[i];
k++;
}
else { p=i+1; break; } // apunta al prximo componente lxico
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();
}
}
G *FG /
I("*");
F();
G();
}
}
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 /
A/
si entrada PRIMERO()
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 sintctico que no es recursivo
TABLA DE ANALISIS
SINTACTICO (TAS)
CONSTRUCCION DE UN ADP
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 a / A b, c
B c
B b /
}
II. TAS
ALGORITMO
A A a A A
B B b B
ALGORITMO DE ANALISIS
Sim apunta al primer componente lxico de w$
Repetir
Sea X smbolo de la cima de la pila y a el smbolo 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
error
entrada
finsi
A
finsi
X
a. . . . . .$
Hasta X = $
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
4
$ cBa
$ cB
abc$
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
}
id + * ( ) $
E ETR ETR
R R+TR R R RECONOCIMIENTO
T TFG TFG
G G G*FG G G
F Fid F(E)
TAS 3
4
$ RGF
$ RG id
id * id $
id * id $
F id
5 $ RG * id $ G * FG
6 $ RGF* * id $
LL(K)
Lectura de los Nmero de smbolos
smbolos de entrada tomados en cada
de izquierda a lectura
derecha
pila A ...b....
:
: entrada
$ M[A, b] = error
PROPIEDADES DESEABLES EN UN
PARSER
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)) i * ( i + i )
tira="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;
}
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}
Se elimina la Vt={while, {, }, id }
Gramtica P={
ambigedad 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 W while $, while
AS/ A while, $, }
Wwhile id { A}
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
dato, a, b: integer;
cant, x: real;
Total: real;
Observacin:
d, a, b: i;
c, x: r;
T: r;
Enviar a zorroculto69@Hotmail.com