tree grammar GwfWalker; options { tokenVocab=Gwf; ASTLabelType=CommonTree; } @header { //package com.geazy.gwf.server.lang.parser; import java.util.HashMap; import java.util.Iterator; //import com.geazy.gwf.model.*; //import com.geazy.gwf.server.utils.*; } @members { HashMap memory = new HashMap(); private FieldState[] fldArr = null; private FieldStateManager fldStateMgr = null; // constructor public GwfWalker(TreeNodeStream nodeStream, FieldStateManager fldMgr) { this(nodeStream); this.fldStateMgr = fldMgr; } private void print(String str) { if ( ParserConstantsIfc.DEBUG ) System.out.println(str); } } prog : statement+ ; statement : ifStatement | assignment | compoundStatement ; ifStatement : ^('if' b=boolExpression ^(TRUE_COND ({$b.result}? => statement | .)) (^(FALSE_COND ({!$b.result}? => statement | .)))?) ; compoundStatement : ^(BLOCK statement*) ; boolExpression returns [ boolean result ] : ^(EXPR e=expression) { if ( $e.type == 1 ) { $result = Boolean.valueOf($e.val).booleanValue(); } } ; assignment : ^(EVAL statementExpression) ; statementExpression : functionCall | ^(assignmentOperator Identifier('.' Identifier)* expression ) | ^(assignmentOperator Identifier('.' Identifier)* functionCall ) ; functionCall : ^(FUNCTION f=Identifier el=expressionList) { fldStateMgr.execute($f.text, $el.exprLst) ;} ; expressionList returns [List exprLst] @init { $exprLst = new ArrayList(); } : ( e=expression { $exprLst.add($e.val); } )+ ; // type: 0 for string, 1 for boolean, expression returns [int type, String val] : ^('or' e1=expression e2=expression) { $type = 1; $val = String.valueOf(Boolean.valueOf($e1.val).booleanValue() || Boolean.valueOf($e2.val).booleanValue()); } | ^('and' e1=expression e2=expression) { $type = 1; $val = String.valueOf(Boolean.valueOf($e1.val).booleanValue() && Boolean.valueOf($e2.val).booleanValue()); } | ^('==' e1=expression e2=expression) { $type = 1; $val = $e1.val == null ? "false": String.valueOf($e1.val.equals($e2.val)); } | ^('!=' e1=expression e2=expression) { $type = 1; $val = $e1.val == null ? "false": String.valueOf(!$e1.val.equals($e2.val)); } | ^('<=' expression expression) | ^('>=' expression expression) | ^('>' e1=expression e2=expression) { $type = 1; $val = String.valueOf(Integer.parseInt($e1.val) > Integer.parseInt($e2.val)); } | ^('<' expression expression) | ^('+' expression expression) | ^('-' expression expression) | ^('*' expression expression) | ^('/' expression expression) | ^('%' expression expression) | id=ident { $type = 0; $val = $id.str; } | e=boolExpression { $type = 1; $val = String.valueOf($e.result); } ; ident returns [ String str ] : ^(VAR s1+=Identifier+) { $str = fldStateMgr.getFieldValue($s1) ; } | l=literal { $str = $l.str; } ; literal returns [ String str ] : s1=integerLiteral { print("integer literal..." + $s1.text); $str = $s1.text; } | s2=FloatingPointLiteral { $str = $s2.text; } | s3=CharacterLiteral { $str = $s3.text; } | s4=StringLiteral { print("string literal..." + $s4.text.substring(1,$s4.text.length()-1)); $str = $s4.text.substring(1,$s4.text.length()-1); } | s5=booleanLiteral { $str = $s5.text; } | s6='null' { $str = $s6.text; } ; integerLiteral : HexLiteral | OctalLiteral | DecimalLiteral ; booleanLiteral : 'true' | 'false' ; assignmentOperator : '=' | '+=' | '-=' | '*=' | '/=' | '&=' | '|=' | '^=' | '%=' ;