[antlr-interest] Evaluation boolean expressions
Tarun Khanna
tarunkhanna at gmail.com
Tue Jul 26 08:35:21 PDT 2005
Hi,
Here is the changed grammar. Seems to work fine. I hope you'll notice the
changes...
The first one is in atom, atom: LPAREN logicalOrExpression RPAREN
Then in the TreeParser, I have added a new rule lexpr.
Parse the tree using logicalOrExpression as the starting point. Then use the
lexpr to walk the tree.
-----------------------------
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! logicalOrExpression 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);}
;
lexpr returns [boolean r= false] {boolean a, b;}
: #(OR a=bexpr b=bexpr) { r = a || b; }
| #(AND a=bexpr b=bexpr) { r = a && b; }
;
On 7/26/05, Xavier Benveniste <xavier.benveniste at free.fr> wrote:
>
> 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);}
>
> // ;
>
--
Tarun Khanna
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20050726/dac6e57f/attachment.html
More information about the antlr-interest
mailing list