Analisador Sintatico/Semantico em java

Alow pessoal.

Alguem tem um exemplo em java para fazer compilador que reconheca expressoes logicas da linguagem java, onde operandos podem ser variaveis ou constante e operadores podem ser aritmeticos, logicos ou relacionais…

valew.

Da uma olhada nesse material http://createyourproglang.com/. É pago mas vale muito apena. É implementado uma linguagem parecida com Ruby que roda diretamente na JVM.

A seguir, estou postando um exemplo.

O parser gerado a partir dessa gramática do ANTLR reconhece expressões matemáticas.

Foram implementados 5 operadores, onde os ‘+’ e ‘-’ tem menor precedência e os ‘*’, ‘/’, e ‘^’ (exponenciação) tem maior precedência. O parser reconhece também expressões com parênteses.

No final do post estou postando o link para você baixar a gramática, o parser gerado e um exemplo de uso, dentro de um projeto do NetBeans com o ANTLR já inserido.

A medida que o parser interpreta a expressão, ele já vai executando as operações apropriadas. Não é apenas um parser que diz se determinada expressão faz ou não parte da linguagem, mas também um pequeno interpretador.

Essa é a gramática:

[code]/*

  • Gramática para cálculo de expressões matemáticas.
  • @author David Buzatto
    */
    grammar Expressoes;

/*

  • Estrutura:

  • E : M ( ‘+’ M | ‘-’ M )*;
    */
    expressao returns [ double v ]

     :    e=multExpr { $v = $e.v; } ( 
              '+' e=multExpr { $v += $e.v; } 
            | '-' e=multExpr { $v -= $e.v; }  
          )*
     ;
     catch [RecognitionException exc] { throw exc; }
    

/*

  • Estrutura:

  • M : A ( '’ A | ‘/’ A | ‘^’ A );
    */
    multExpr returns [ double v ]

     :    e=atom { $v = $e.v; } ( 
              '*' e=atom { $v *= $e.v; } 
            | '/' e=atom { $v /= $e.v; } 
            | '^' e=atom { $v = Math.pow( $v, $e.v ); }
          )*
     ;
     catch [RecognitionException exc] { throw exc; }
    

atom returns [ double v ]

    :    NUMERO {
            $v = Double.parseDouble( $NUMERO.text );
         }
    |    '(' expressao ')' {
             $v = $expressao.v;
         }
    ;
    catch [RecognitionException exc] { throw exc; }

NUMERO : (‘0’…‘9’)+ ‘.’ (‘0’…‘9’)*
| ‘.’ (‘0’…‘9’)+
| (‘0’…‘9’)+
;

WS : ( ’ ’ | ‘\t’ | ‘\r’ | ‘\n’ ) {$channel=HIDDEN;};[/code]

Esse é o código para usar o parser gerado:

[code]import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;

/**
*

  • @author David Buzatto
    */
    public class TesteExpressoes {

    /**

    • @param args the command line arguments
      */
      public static void main( String[] args ) {

      String expressao = “5*(3+4)”;
      ANTLRStringStream input = new ANTLRStringStream( expressao );
      ExpressoesLexer lexer = new ExpressoesLexer( input );
      CommonTokenStream tokens = new CommonTokenStream( lexer );
      ExpressoesParser parser = new ExpressoesParser( tokens );

      try {
      double resultado = parser.expressao();
      System.out.printf( “%s = %.2f\n”, expressao, resultado );
      } catch ( RecognitionException exc ) {
      exc.printStackTrace();
      }

    }
    }[/code]

Download: http://www.4shared.com/file/Oc21SoID/Parser_Expressoes.html

[]'s

Valeu mesmo pela dica pessoal. Vou implementar no meu projecto e qualquer duvida posto aqui…