rendered paste bodyheader{ 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) {;} ;