Antlr演習用データ 【文法の骨子のみの版】 grammar T; prog : stat+; stat : expr NEWLINE | ID '=' expr NEWLINE | NEWLINE ; expr : multExpr (('+'|'-') multExpr)* ; multExpr: atom('*' atom)* ; atom : INT | ID | '(' expr ')' ; ID : ('a'..'z'|'A'..'Z')+; INT : '0'..'9'+; NEWLINE : '\r'? '\n'; WS : (' '|'\t'|'\n'|'\r')* {skip();}; 【動作を追加した版】 grammar Expr; @header { package test; import java.util.HashMap; } @lexer::header {package test;} @members { /** Map variable name to Integer object holding value */ HashMap memory = new HashMap(); } prog: stat+ ; stat: expr NEWLINE {System.out.println($expr.value);} | ID '=' expr NEWLINE {memory.put($ID.text, new Integer($expr.value));} | NEWLINE ; expr returns [int value] : e=multExpr {$value = $e.value;} ( '+' e=multExpr {$value += $e.value;} | '-' e=multExpr {$value -= $e.value;} )* ; multExpr returns [int value] : e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})* ; atom returns [int value] : INT {$value = Integer.parseInt($INT.text);} | ID { Integer v = (Integer)memory.get($ID.text); if ( v!=null ) $value = v.intValue(); else System.err.println("undefined variable "+$ID.text); } | '(' e=expr ')' {$value = $e.value;} ; ID : ('a'..'z'|'A'..'Z')+ ; INT : '0'..'9'+ ; NEWLINE:'\r'? '\n' ; WS : (' '|'\t')+ {skip();} ;                             以 上