[antlr-interest] Evaluation boolean expressions

Xavier Benveniste xavier.benveniste at free.fr
Tue Jul 26 06:13:07 PDT 2005


Hi,

I (hardly) succeeded in building a very simple int calculator.
Then, I succeeded in building an int 'equality' evaluator :
for instance, if I enter :
5+(4*3) > 10 + 9
I have the following result :

( > ( + 5 ( * 4 3 ) ) ( + 10 9 ) )

false

So far, so good.

Now, what I'm trying to do is to evaluate expression like :
(4 + (5*2) > 15) OR (4>1).
But, here I'm stuck.

You 'll find below the grammar I wrote.
I'm sure it's pretty straightforward but I can't manage to achieve it.
If any ANTLR's guru could help me.
Thanks.
class ExprParser extends Parser;

options {

buildAST = true;

defaultErrorHandler = false;

}

//logicalOrExpression: logicalAndExpression (OR^ logicalAndExpression)*

// ;

//logicalAndExpression: bexpr (AND^ bexpr)*

// ;

bexpr: expr ((EQUALS^|NOT_EQUALS^|GT^|GTE^|LT^|LTE^) expr)*

;

expr: mexpr ((PLUS^|MINUS^) mexpr)*

;


mexpr

: atom ((MULT^|DIV^) atom)*

;

atom: INT

| LPAREN! expr RPAREN!

// | LPAREN! logicalOrExpression RPAREN!

;

class ExprLexer extends Lexer;

options {

k = 2; // two characters of lookahead

}

/* Integers */

INT : ('0'..'9')+ ;

/* Ignored characters */

WS : ( ' '

| '\r' '\n'

| '\n'

| '\t'

)

{$setType(Token.SKIP);}

;

/* Logical operators */

OR : "OR";

AND : "AND";

/* Comparison operators */

EQUALS : "==";

NOT_EQUALS : "<>";

GT : '>';

GTE : ">=";

LT : '<';

LTE : "<=";

/* Arithmetic operators */

PLUS : '+';

MINUS : '-';

MULT : '*';

DIV : '/';

/* Parentheses */

LPAREN : '(';

RPAREN : ')';

class ExprTreeParser extends TreeParser;

options {

importVocab=ExprParser;

}

expr returns [int r=0] { int a,b;}

: #(PLUS a=expr b=expr) { r = a + b;}

| #(MINUS a=expr b=expr) { r = a - b; }

| #(MULT a=expr b=expr) { r = a * b; }

| #(DIV a=expr b=expr) { r = a / b; }

| i:INT {r = (int)Integer.parseInt(i.getText());}

;

bexpr returns [boolean r=false] { int a,b; }

: #(EQUALS a=expr b=expr) {r = (a == b);}

| #(NOT_EQUALS a=expr b=expr) {r = (a != b);} 

| #(GT a=expr b=expr) {r = (a > b);}

| #(GTE a=expr b=expr) {r = (a >= b);}

| #(LT a=expr b=expr) {r = (a < b);}

| #(LTE a=expr b=expr) {r = (a <= b);}

;

//logicalAndExpression returns [boolean r=false] { boolean a,b; }

// : #(AND a=bexpr b=bexpr) {r = (a && b); }

// ;


//logicalOrExpression returns [boolean r=false] {boolean a,b; }

// : #(OR a=logicalAndExpression b=logicalAndExpression) {r = (a || b);}

// ;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20050726/c0dfe465/attachment-0001.html


More information about the antlr-interest mailing list