リッチ計算機(ただし整数のみ)

変数つけた
カッコつけた

caperとcapella(AST作成ツール)のおかげで結構楽はできているが、
それでもソースがややこしくなってきた
そろそろ整理するか


ただいまの文法

%token Number<calc::Integer*> Identifier<calc::Identifier*>;
%token Add Sub Mul Div Var Equal LPar RPar;
%namespace calc;
%dont_use_stl;

////////////////////////////////////////////////////////////////
// Module
Module<calc::Module*>
	: [makeModule] Statements(0)
	;

Statements<calc::Statements*>
	: [makeStatements0] Statement(0)
	| [makeStatements1] Statements(0) Statement(1)
	;

////////////////////////////////////////////////////////////////
// Statement
Statement<calc::Statement*>
	: [makeStatement] VarDecl(0)
	| [makeStatement] Expr(0)
	;

////////////////////////////////////////////////////////////////
// VarDecl
VarDecl<calc::VarDecl*>
	: [makeVarDecl] Var Identifier(0) Equal Expr(1)
	;

////////////////////////////////////////////////////////////////
// Expr
Expr<calc::Expr*>
	: [makeExpr] Term(0)
	| [makeAdd] Expr(0) Add Term(1)
	| [makeSub] Expr(0) Sub Term(1)
	;

////////////////////////////////////////////////////////////////
// Term
Term<calc::Term*>
	: [makeTerm] PrimExpr(0)
	| [makeMul] Term(0) Mul PrimExpr(1)
	| [makeDiv] Term(0) Div PrimExpr(1)
	;

////////////////////////////////////////////////////////////////
// PrimExpr
PrimExpr<calc::PrimExpr*>
	: [makeLiteral] Number(0)
	| [makeVarRef] Identifier(0)
	| [makeParenthized] LPar Expr(0) RPar
	;