All pastes #901465 Raw Edit

gramatica ANTLR

public java v1 · immutable
·published 2008-02-12 17:59 UTC
rendered paste body
header{	import java.util.Hashtable;}///////////////////////////////// Analizador lxico///////////////////////////////class Analex extends Lexer;BLANCO:(' '|'\n'|"\r\n")+ {$setType(Token.SKIP);};protected DIGITO:('0'..'9');protected ALFA:('a'..'z')|('A'..'Z')|'_';protected ALFANUM:(ALFA|DIGITO);NUMERO:(DIGITO)+;IDENT:ALFA(ALFANUM)*;SUMA:'+';RESTA:'-';MULT:'*';DIV:'/';IGUAL:'=';PTC:';';PA:'(';PC:')';///////////////////////////////// Analizador sintctico///////////////////////////////class Anasint extends Parser;options {   buildAST = true;}tokens {	ROOT;	DECLARACION;	LLAMADA;}instrucciones : ( instruccion )* EOF!   				{##=#(#[ROOT,"ROOT"],##);}   			  ;instruccion : (IDENT IGUAL) => asignacion ";"!		    | (IDENT "(" IDENT ")" IGUAL) => declaracion ";"!		    | expresion ";"!		    ;asignacion : IDENT IGUAL^ expresion		   ;declaracion : n:IDENT "("! p:IDENT ")"! IGUAL! c:expresion				{#declaracion=#(#[DECLARACION,"DECLARACION"],#n,#p,#c);} ;expresion : exp_mult (("+"^|"-"^) exp_mult)* ;	  exp_mult : exp_base (("*"^|"/"^) exp_base)* ;exp_base : NUMERO			| (IDENT "(") => llamada			| IDENT			| "-"^ NUMERO			| "("! expresion ")"!			;llamada : n:IDENT "("! p:expresion ")"!			{##=#(#[LLAMADA,"LLAMADA"],#n,#p);} ;///////////////////////////////// Evaluador de expresiones///////////////////////////////class Evaluador extends TreeParser;{	Hashtable variables = new Hashtable();	Hashtable funciones = new Hashtable();	Hashtable parametros = new Hashtable();}instrucciones    : #(ROOT (instruccion)*)   ;   instruccion {float e; String s;}	: e=expr		{System.out.println("Resultado: " + e);}    | s=asig      	{System.out.println("Asignacin: " + s + " vale "+ variables.get(s));}    | s=decl    	{System.out.println("Funcin " + s + " declarada satisfactoriamente");}    ;expr returns [float result=0] {float izq=0, der=0;}   : n:NUMERO       {result = Float.parseFloat(n.getText());}   | s:IDENT   	   {result = ((Float)variables.get(new String(s.getText()))).floatValue();}   | #("+" izq=expr der=expr)       {result = izq + der;}   | (#("-" izq=expr der=expr)) => #("-" izq=expr der=expr)       {result = izq - der;}   | #("-" der=expr)   	   {result = der * -1;}   | #("*" izq=expr der=expr)       {result = izq * der;}   | #("/" izq=expr der=expr)   	   {result = izq / der;}   ;   exception catch [ArithmeticException ae] {   	   System.err.println("Excepcion: " + ae.getMessage());       result = 0;   }   asig returns [String result=""] {float der;}   : #(IGUAL izq:IDENT der=expr)   	   {result = izq.getText(); variables.put(izq.getText(),new Float(der));}   ;decl returns [String result=""]	: #(DECLARACION func:IDENT param:IDENT cuerpo:AST)		{result = func.getText(); funciones.put(func.getText(),cuerpo);		parametros.put(func.getText(),param);}	;llam returns [float result=0] {float param;}	: #(LLAMADA func:IDENT param=expr)		{;}	;