// name must match file name grammar WAE; // Grammar rules waeStart returns [WAENode value] : w=wae SEMI { $value = $w.value; }; wae returns [WAENode value] : n=NUMBER { WAENode n = new WAENode(); n.setNodeType("num"); n.setValue(Double.parseDouble($n.text)); $value = n; } | LBRACE PLUS w1=wae w2=wae RBRACE { WAENode n = new WAENode(); n.setNodeType("plus"); n.setChild1($w1.value); n.setChild2($w2.value); $value = n; } | LBRACE MINUS w1=wae w2=wae RBRACE { WAENode n = new WAENode(); n.setNodeType("minus"); n.setChild1($w1.value); n.setChild2($w2.value); $value = n; } | LBRACE TIMES w1=wae w2=wae RBRACE { WAENode n = new WAENode(); n.setNodeType("multiply"); n.setChild1($w1.value); n.setChild2($w2.value); $value = n; } | LBRACE DIV w1=wae w2=wae RBRACE { WAENode n = new WAENode(); n.setNodeType("divide"); n.setChild1($w1.value); n.setChild2($w2.value); $value = n; } | LBRACE IF w1=wae w2=wae w3=wae RBRACE { WAENode n = new WAENode(); n.setNodeType("if"); n.setChild1($w1.value); n.setChild2($w2.value); n.setChild3($w3.value); $value = n; } ; // Lexer rules // fragments are not tokens //fragment VALID_ID_START : ('a'..'z') | ('A'..'Z') | '_'; //fragment VALID_ID_CHAR : VALID_ID_START | ('0'..'9'); fragment I : ('I'|'i') ; fragment F : ('F'|'f') ; //tokens NUMBER : ('0'..'9')+; LBRACE : '{'; RBRACE : '}'; SEMI : ';'; PLUS : '+'; MINUS : '-'; TIMES : '*'; DIV : '/'; IF : I F; //ID : VALID_ID_START VALID_ID_CHAR*; //White Space WS : [ \r\n\t]+ -> skip;