/* ArithExpParser.jj * * 簡単な算術式の構文をJavaccで記述したサンプル * */ options { STATIC=true; } PARSER_BEGIN(ArithExpParser) public class ArithExpParser { public static void main(String args[]) throws ParseException { } } PARSER_END(ArithExpParser) TOKEN_MGR_DECLS: { StringBuffer sb; } SKIP : { } TOKEN : { | | | | | } /* === 方式1 === * 式 ::= 加数 ('+' 加数)* * 加数 ::= 因数 ('*' 因数)* * 因数 ::= 数 | '-' 因数 | '(' 式 ')' */ /* 式 ::= 加数 ('+' 加数)* */ Node expression1() : { Node tree, rest; } { tree = summand1() ( rest = summand1() { tree = new BinaryOpNode("+", tree, rest); })* { return tree; } } /* 加数 ::= 因数 ('*' 因数)* */ Node summand1() : { Node tree, rest; } { tree = factor1() ( rest = factor1() { tree = new BinaryOpNode("*", tree, rest); })* { return tree; } } /* 因数 ::= 数 | '-' 因数 | '(' 式 ')' */ Node factor1() : { Token tok; Node operand, exp; } { tok = { return new NumberNode(tok.image); } | operand = factor1() { return new UnaryOpNode("-", operand); } | exp = expression1() { return exp; } } /*=== 方式2 === * 式 ::= 加数 ('+' 式)? * 加数 ::= 因数 ('*' 加数)? * 因数 ::= 数 | '-' 因数 | '(' 式 ')' */ /* 式 ::= 加数 ('+' 式)? */ Node expression2() : { Node tree, rest; } { tree = summand2() ( rest = expression2() { tree = new BinaryOpNode("+", tree, rest); })? { return tree; } } /* 加数 ::= 因数 ('*' 加数)? */ Node summand2() : { Node tree, rest; } { tree = factor2() ( rest = summand2() { tree = new BinaryOpNode("*", tree, rest); })? { return tree; } } /* 因数 ::= 数 | '-' 因数 | '(' 式 ')' */ Node factor2() : { Token tok; Node operand, exp; } { tok = { return new NumberNode(tok.image); } | operand = factor2() { return new UnaryOpNode("-", operand); } | exp = expression2() { return exp; } } /*=== 方式3、うごかない === * 式 ::= 加数 '+' 式 | 加数 * 加数 ::= 因数 '*' 加数 | 因数 * 因数 ::= 数 | '-' 因数 | '(' 式 ')' */ /* 式 ::= 加数 '+' 式 | 加数 */ Node expression3() : { Node tree, rest; } { ( LOOKAHEAD(2) tree = summand3() rest = expression3() { tree = new BinaryOpNode("+", tree, rest); } | tree = summand3() ) { return tree; } } /* 加数 ::= 因数 '*' 加数 | 因数 */ Node summand3() : { Node tree, rest; } { ( LOOKAHEAD(2) tree = factor3() rest = summand3() { tree = new BinaryOpNode("*", tree, rest); } | tree = factor3() ) { return tree; } } /* 因数 ::= 数 | '-' 因数 | '(' 式 ')' */ Node factor3() : { Token tok; Node operand, exp; } { tok = { return new NumberNode(tok.image); } | operand = factor3() { return new UnaryOpNode("-", operand); } | exp = expression3() { return exp; } }