Update of /cvsroot/bprocessor/model/src/etc
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28654/src/etc
Modified Files:
expression.g
Log Message:
Expression Parser and Evaluator supporting global variables implemented
Index: expression.g
===================================================================
RCS file: /cvsroot/bprocessor/model/src/etc/expression.g,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** expression.g 15 May 2006 15:21:59 -0000 1.1
--- expression.g 16 May 2006 13:34:29 -0000 1.2
***************
*** 1,7 ****
header {
package net.sourceforge.bprocessor.model.parser;
}
! class ExprLexer extends Lexer;
options {
--- 1,8 ----
header {
package net.sourceforge.bprocessor.model.parser;
+ import java.util.HashMap;
}
! class ExpressionLexer extends Lexer;
options {
***************
*** 10,37 ****
}
! LPAREN: '(' ;
! RPAREN: ')' ;
! PLUS : '+' ;
! MINUS : '-' ;
! STAR : '*' ;
! INT : ('0'..'9')+ ;
! WS : ( ' '
! | '\r' '\n'
! | '\n'
! | '\t'
! )
! {$setType(Token.SKIP);}
! ;
! class ExprParser extends Parser;
- expr: mexpr ((PLUS|MINUS) mexpr)*
- ;
! mexpr
! : atom (STAR atom)*
! ;
! atom: INT
! | LPAREN expr RPAREN
;
--- 11,102 ----
}
! StartTerm: '(' ;
! EndTerm: ')' ;
! Plus : '+' ;
! Minus : '-' ;
! Multiply : '*' ;
! Divide : '/' ;
! Period : '.' ;
! End : ';' ;
! protected Letter
! : Upper | Lower
! ;
!
! protected Upper
! : 'A' .. 'Z'
! ;
!
! protected Lower
! : 'a' .. 'z'
! ;
!
! protected Digit : '0'..'9' ;
! protected Integer : (Digit)+ ;
! protected Real : Integer Period Integer ;
! Number : (Integer Period Integer) => Real | ( Integer ) => Integer ;
!
! Identifier
! : (Letter | '_' ) ( Letter | Digit | '_' )*
! ;
!
!
!
! WhiteSpace
! : ( ' '
! | '\r' '\n'
! | '\n'
! | '\t'
! )
! {$setType(Token.SKIP);}
! ;
!
! class ExpressionParser extends Parser;
!
!
!
! program[HashMap env] returns [double value = 0]
! : value = expression[env] End
! ;
! expression[HashMap env] returns [double value = 0]
! { double x; }
! : value = term[env]
! ( Plus x = term[env] { value += x; }
! | Minus x = term[env] { value -= x; }
! )*
! ;
!
! term[HashMap env] returns [double value = 0]
! { double x; }
! : value = atom[env]
! ( Multiply x = atom[env] { value *= x; }
! | Divide x = atom[env] { value /= x; }
! )*
! ;
!
! atom[HashMap env] returns [double value = 0]
! : value = literal
! | value = variable[env]
! | StartTerm value = expression[env] EndTerm
! | value = unary[env]
! ;
!
! unary[HashMap env] returns [double value = 0]
! : Plus value = atom[env]
! | Minus value = atom[env] { value = -value; }
! ;
!
! literal returns [double value = 0]
! : n:Number { value = Double.parseDouble(n.getText()); }
! ;
!
! variable[HashMap env] returns [double value = 0]
! : i:Identifier { Double d = (Double) env.get(i.getText());
! if (d != null) {
! value = d.doubleValue();
! }
! }
;
|