You are on page 1of 5

PRCTICAS DE LABORATORIO

ANLISIS SINTCTICO (2)


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:

A1 = {
(q0,q1,q2),(a,b),q0,(q2),
(<q0,a>:<q0>,
<q0,b>:<q1>,
<q1,a>:<q2>,
<q2,b>:<q2>)
}

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

You might also like