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