LENGUAJES FORMALES Y AUTMATAS CURSO 2006/2007 UNIVERSIDAD DE SEVILLA E. T. S. INGENIERA INFORMTICA LENGUAJES Y SISTEMAS INFORMTICOS Atribucin ent ent NUM NUM ent NUM 3 2 3 4 5 9 (abc) Escriba una gramtica para reconocer 1 cadena de la forma a i b j c k imprimiendo: Regular (si ijk) Independiente del contexto (si i=jk o i=kj o j=ki) Dependiente del contexto (si i=j=k) (Maximo) Atribuya la gramtica del ejemplo para calcular el mximo de todos los nmeros que aparecen en la entrada Salto = \r|\n|\r\n Blanco = [ \t\f] Num = ("+"|"-")?[0-9]+ %% {Blanco}+ {;} {Salto}+ {;} {Num} {return new Symbol(sym.NUM);} . {;} terminal NUM; non terminal ent;
ent ::= ent NUM | NUM ; terminal Integer NUM; non terminal Integer ent;
ent ::= ent:e NUM:n {: RESULT = new Integer(e.intValue()+n.intValue()); :} | NUM:n {: RESULT = n; :} ; Salto = \r|\n|\r\n Blanco = [ \t\f] Num = ("+"|"-")?[0-9]+ %% {Blanco}+ {;} {Salto}+ {;} {Num} {return new Symbol(sym.NUM,new Integer(yytext()));} . {;} ENTRADA: 3 2 4 (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) 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). 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. import java_cup.runtime.Symbol; parser code {: public void syntax_error(Symbol cur_token) { System.err.print("ERROR SINTCTICO(" + (cur_token.left+1) + "," + (cur_token.right+1) + "): ");
System.err.println("Con el token [" + cur_token.sym + "=\"" + cur_token.value + "\"]."); System.exit(-1); } :}; // Resto de las zonas de la gramtica (terminales y no terminales, etc). En el Parser implementamos el mtodo syntax_error en la gramtica 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());} En el Lexer aadimos informacin sobre lneas y columnas Un ejemplo de atribucin ent Salto = \r|\n|\r\n Blanco = [ \t\f] Num = ("+"|"-")?[0-9]+ %% {Blanco}+ {;} {Salto}+ {;} {Num} {return new Symbol(sym.NUM);} . {System.out.println ("Error lxico");} ENTRADA: 1 4 3-5 terminal GUION; terminal NUM; non terminal ent, elem;
ent ::= ent elem | elem ; elem ::= NUM | NUM GUION NUM ; terminal GUION; terminal Integer NUM; non terminal VectorPag ent, elem;
ent ::= ent:e elem:el {: RESULT = Unir(e,n); :} | elem:el {: RESULT = el; :} ; elem ::= NUM:n {: RESULT = Pagina(n); :} | NUM:n1 GUION NUM:n2 {: RESULT = Rango(n1,n2); :} ; Salto = \r|\n|\r\n Blanco = [ \t\f] Num = ("+"|"-")?[0-9]+ %% {Blanco}+ {;} {Salto}+ {;} {Num} {return new Symbol(sym.NUM,new Integer(yytext()));} . {System.out.println ("Error lxico");} elem NUM elem NUM ent ent elem NUM NUM GUION 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 1 1 1 1 4 3 5 (Probabilistico) Disee una gramtica para reconocer vectores de reales con el formato (0.2 0.4 0.1 0.3) y atribyala para que indique si el vector es probabilstico (todos sus elementos suman 1 y estn entre 0 y 1) mostrando SI o NO en caso contrario (Automata) Disee un analizador que reciba de la entrada un autmata finito descrito con el formato (Estados, Entradas, Estado inicial, Estados finales, Transiciones), p. ej:
y compruebe si se trata de un autmata finito determinista o no determinista Los atributos son de tipo Object Otro ejemplo de atribucin Salto = \r|\n|\r\n Blanco = [ \t\f] Num = ("+"|"-")?[0-9]+ %% {Blanco}+ {;} {Salto}+ {;} {Num} {return new Symbol(sym.NUM);} "(" {return new Symbol(sym.BPAREN);} ")" {return new Symbol(sym.EPAREN);} . {System.out.println ("Error lxico");} ENTRADA: ((4) 5) terminal NUM, BPAREN, EPAREN; non terminal entrada, arbol; non terminal lista, elemento;
entrada ::= arbol ; arbol ::= BPAREN lista EPAREN ; lista ::= lista elemento | ; elemento ::= NUM | arbol ; entrada arbol ( ) els els el NUM els el arbol ( ) els els el NUM (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). entrada arbol ( ) els els el NUM els el arbol ( ) els els el NUM