Está en la página 1de 5

UNIVERSIDAD DE SEVILLA

E. T. S. INGENIERA INFORMTICA
LENGUAJES Y SISTEMAS INFORMTICOS

PRCTICAS DE LABORATORIO
ANLISIS SINTCTICO (2)

LENGUAJES FORMALES Y AUTMATAS


CURSO 2006/2007
Atribucin

La atribucin permite adjuntar informacin adicional a los smbolos de la


gramtica. Esta informacin puede emplearse para llevar a cabo operaciones o
clculos sobre el rbol sintctico (dndole una interpretacin semntica).
terminal NUM; Integer NUM;
non terminal ent;
Integer ent;

ent ::= ent NUM


ent:e NUM:n {: RESULT = new Integer(e.intValue()+n.intValue()); :}
| NUM ;
NUM:n {: RESULT = n; :} ;
ent 9
Salto = \r|\n|\r\n
Blanco = [ \t\f]
Num = ("+"|"-")?[0-9]+
%% ENTRADA: ent 5 NUM 4
{Blanco}+ {;} 3 2 4
{Salto}+ {;}
{Num} Symbol(sym.NUM);} Integer(yytext()));}
{return new Symbol(sym.NUM,new
. {;} ent 3 NUM 2

(Maximo) Atribuya la gramtica del ejemplo para calcular el


mximo de todos los nmeros que aparecen en la entrada NUM 3
(Desorden) Atribuya la gramtica del ejemplo para que en el caso de encontrar dos nmeros
consecutivos x e y desordenados, los muestre en pantalla con el formato (x,y)

(abc) Escriba una gramtica para reconocer 1 cadena de la forma a ibjck imprimiendo:
Regular (si ijk)
Independiente del contexto (si i=jk o i=kj o j=ki)
Dependiente del contexto (si i=j=k)
Mensajes de error ms elaborados

Con la atribucin podemos conseguir que en caso de que una cadena no encaje
en la gramtica se devuelva al usuario un mensaje de error ms explicativo.
En el Parser import java_cup.runtime.Symbol;
parser code {:
implementamos public void syntax_error(Symbol cur_token)
el mtodo {
syntax_error System.err.print("ERROR SINTCTICO(" + (cur_token.left+1) + "," +
(cur_token.right+1) + "): ");
en la gramtica
System.err.println("Con el token [" + cur_token.sym +
"=\"" + cur_token.value + "\"].");
En el Lexer System.exit(-1);
}
aadimos :};
informacin sobre // Resto de las zonas de la gramtica (terminales y no terminales, etc).
lneas y columnas
import java_cup.runtime.*;
%%
%class Lexer
%unicode
%cup
%line
%column
//Aqu faltara la definicin de las macros Blanco, Numero e Identificador.
%%
{Blanco}+ {;}
{Numero} {return new Symbol (sym.NUM, yyline, yycolumn, yytext());}
{Identificador} {return new Symbol (sym.IDENT, yyline, yycolumn, yytext());}
. {System.out.println ("Error lxico:"+yyline+","+yycolumn+" carcter "+yytext());}
Un ejemplo de atribucin

Salto = \r|\n|\r\n (Probabilistico) Disee una


Blanco = [ \t\f] gramtica para reconocer
Num = ("+"|"-")?[0-9]+ vectores de reales con el
%% formato (0.2 0.4 0.1 0.3) y
{Blanco}+ {;} atribyala para que indique si
{Salto}+ {;} el vector es probabilstico
{Num} {return
{return
new new Symbol(sym.NUM);}
Symbol(sym.NUM,new Integer(yytext()));} (todos sus elementos suman 1 y
. {System.out.println
{System.out.println ("Error
("Error lxico");}
lxico");} estn entre 0 y 1) mostrando
SI o NO en caso contrario
terminal GUION;
terminal NUM;
Integer NUM;
Los atributos son de
non terminal ent, elem; ent, elem;
VectorPag tipo Object (Automata) Disee un
analizador que reciba de la
ent ::= ent elem
ent:e elem:el {: RESULT = Unir(e,n); :} entrada un autmata finito
| elem ;
elem:el {: RESULT = el; :} ; descrito con el formato
elem ::= NUM
NUM:n {: RESULT = Pagina(n); :} (Estados, Entradas, Estado
| NUM GUION NUM ;
NUM:n1 GUION NUM:n2 {: RESULT = Rango(n1,n2); :} ; inicial, Estados finales,
Transiciones), p. ej:

ENTRADA: ent 1 0 1 1 1 A1 = {
1 4 3-5 (q0,q1,q2),(a,b),q0,(q2),
(<q0,a>:<q0>,
ent 1 0 0 1 0 elem 0 0 1 1 1 <q0,b>:<q1>,
<q1,a>:<q2>,
<q2,b>:<q2>)
ent 1 0 0 0 0 elem 0 0 0 1 0 NUM 3 GUION NUM 5 }

y compruebe si se trata de un
elem 1 0 0 0 0 NUM 4 autmata finito determinista o
no determinista
NUM 1
Otro ejemplo de atribucin

Salto = \r|\n|\r\n ENTRADA: entrada


Blanco = [ \t\f] ((4) 5)
Num = ("+"|"-")?[0-9]+
%%
arbol
{Blanco}+ {;}
{Salto}+ {;} ( els )
{Num} {return new Symbol(sym.NUM);}
"(" {return new Symbol(sym.BPAREN);} els el
")" {return new Symbol(sym.EPAREN);}
. {System.out.println ("Error lxico");}
els el NUM
terminal NUM, BPAREN, EPAREN;
non terminal entrada, arbol; arbol
non terminal lista, elemento;

entrada ::= arbol ;


( els )
arbol ::= BPAREN lista EPAREN ;
lista ::= lista elemento els el
|
;
elemento ::= NUM
NUM
| arbol ;

(Profundidad) Atribuya la gramtica para calcular la profundidad mxima de un rbol (para


una entrada = (1 (2 (3 (4) 5) 6 7 8) 9) sera 4)

(Anchura) Atribuya la gramtica para calcular la anchura mxima de un rbol (para una
entrada = (1 (2 (3 (4) 5) 6 7 8) 9) sera 5).

También podría gustarte