La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (2) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007 UNIVERSIDAD DE SEVILLA E. T. S. INGENIERÍA INFORMÁTICA.

Presentaciones similares


Presentación del tema: "PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (2) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007 UNIVERSIDAD DE SEVILLA E. T. S. INGENIERÍA INFORMÁTICA."— Transcripción de la presentación:

1 PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (2) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007 UNIVERSIDAD DE SEVILLA E. T. S. INGENIERÍA INFORMÁTICA LENGUAJES Y SISTEMAS INFORMÁTICOS

2 Atribución ent NUM ent NUM 3 23 45 9 (abc) Escriba una gramática para reconocer 1 cadena de la forma a i b j c k imprimiendo: “Regular” (si i≠j≠k) “Independiente del contexto” (si i=j≠k o i=k≠j o j=k≠i) “Dependiente del contexto” (si i=j=k) (Maximo) Atribuya la gramática del ejemplo para calcular el máximo de todos los números 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 gramática del ejemplo para que en el caso de encontrar dos números consecutivos x e y desordenados, los muestre en pantalla con el formato “(x,y)” La atribución permite adjuntar información adicional a los símbolos de la gramática. Esta información puede emplearse para llevar a cabo operaciones o cálculos sobre el árbol sintáctico (dándole una interpretación semántica).

3 Mensajes de error más elaborados Con la atribución podemos conseguir que en caso de que una cadena no encaje en la gramática se devuelva al usuario un mensaje de error más explicativo. import java_cup.runtime.Symbol; parser code {: public void syntax_error(Symbol cur_token) { System.err.print("ERROR SINTÁCTICO(" + (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 gramática (terminales y no terminales, etc). En el Parser implementamos el método syntax_error en la gramática import java_cup.runtime.*; % %class Lexer %unicode %cup %line %column //Aquí faltaría la definición 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 léxico:"+yyline+","+yycolumn+" carácter "+yytext());} En el Lexer añadimos información sobre líneas y columnas

4 Un ejemplo de atribución ent Salto = \r|\n|\r\n Blanco = [ \t\f] Num = ("+"|"-")?[0-9]+ % {Blanco}+ {;} {Salto}+ {;} {Num} {return new Symbol(sym.NUM);}. {System.out.println ("Error léxico");} 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 léxico");} elem NUM elem NUM ent elem NUM GUION 10000 0001010000 0011110010 10111 1 4 3 5 (Probabilistico) Diseñe una gramática para reconocer vectores de reales con el formato (0.2 0.4 0.1 0.3) y atribúyala para que indique si el vector es probabilístico (todos sus elementos suman 1 y están entre 0 y 1) mostrando “SI” o “NO” en caso contrario (Automata) Diseñe un analizador que reciba de la entrada un autómata finito descrito con el formato (Estados, Entradas, Estado inicial, Estados finales, Transiciones), p. ej: A1 = { (q0,q1,q2),(a,b),q0,(q2), ( :, :, : ) } y compruebe si se trata de un autómata finito determinista o no determinista Los atributos son de tipo Object

5 Otro ejemplo de atribución 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 léxico");} 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 el NUM els el λ arbol () els el NUM λ (Profundidad) Atribuya la gramática para calcular la profundidad máxima de un árbol (para una entrada = “(1 (2 (3 (4) 5) 6 7 8) 9)” sería 4) (Anchura) Atribuya la gramática para calcular la anchura máxima de un árbol (para una entrada = “(1 (2 (3 (4) 5) 6 7 8) 9)” sería 5). entrada arbol () els el NUM els el λ arbol () els el NUM λ


Descargar ppt "PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (2) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007 UNIVERSIDAD DE SEVILLA E. T. S. INGENIERÍA INFORMÁTICA."

Presentaciones similares


Anuncios Google