[Bprocessor-commit] model/src/etc expression.g,1.1,1.2
Status: Pre-Alpha
Brought to you by:
henryml
|
From: Michael L. <he...@us...> - 2006-05-16 13:34:36
|
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(); ! } ! } ; |