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.
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]/*
/*
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…