Skip to content

Instantly share code, notes, and snippets.

@pocketberserker
Created January 4, 2012 17:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pocketberserker/1561030 to your computer and use it in GitHub Desktop.
Save pocketberserker/1561030 to your computer and use it in GitHub Desktop.
ANTLRのtree grammarでΣ演算
grammar Calculator;
options {
output = AST;
ASTLabelType=CommonTree;
}
tokens { SUM; NEG; VARIABLE; }
@members { CommonTree subExpr; }
prog: sumExpr
;
sumExpr
: 'sum' 'i' ':' INT '..' INT 'of' expr -> ^(SUM INT INT expr)
;
finally { subExpr = $sumExpr.tree; }
expr: multExpr (('+'^ |'-'^) multExpr)*
;
multExpr : unary (('*'^ |'/'^) unary)*
;
unary : factor
| '+' factor -> factor
| '-' factor -> ^(NEG factor)
;
factor : DOUBLE
| INT
| 'i' -> VARIABLE
| '('! expr ')'!
;
INT : '0'..'9'+ ;
DOUBLE : INT '.' INT*
| '.' INT
;
COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
| '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
;
WS : (' '|'\t'|'\n'|'\r')+ {$channel=HIDDEN;} ;
tree grammar Eval;
options {
tokenVocab=Calculator;
ASTLabelType=CommonTree;
}
@members {
int variable;
CommonTree subExpr;
public Eval(CommonTreeNodeStream input,CommonTree tree) {
this(input);
this.subExpr = tree;
}
private Eval(CommonTree tree, int variable){
this(new CommonTreeNodeStream(tree),tree);
this.variable = variable;
}
}
prog: sumExpr { System.out.println($sumExpr.value); }
;
sumExpr returns [double value]
: ^(SUM
init=INT { int initialize = Integer.parseInt($init.text); }
max=INT
{
int maximum = Integer.parseInt($max.text);
variable = initialize;
}
c=expr
{
$value += c;
for(int i = variable + 1; i <= maximum; ++i) {
Eval eval = new Eval((CommonTree)subExpr.getChild(2),i);
value += eval.expr();
}
}
)
;
expr returns [double value]
: ^('+' left=expr right=expr) {$value = left + right;}
| ^('-' left=expr right=expr) {$value = left - right;}
| ^('*' left=expr right=expr) {$value = left * right;}
| ^('/' left=expr right=expr) {$value = left / right;}
| ^(NEG result=expr) {$value = -result;}
| VARIABLE {$value = variable;}
| INT {$value = Integer.parseInt($INT.text);}
| DOUBLE {$value = Double.parseDouble($DOUBLE.text);}
;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment