次のような非常に単純な式の文法定義は、ANTLR で既に作成しています(a + b) * c
。
grammar SimpleCalc;
options {
language=CSharp2;
output=AST;
}
tokens {
PLUS = '+' ;
MINUS = '-' ;
MULT = '*' ;
DIV = '/' ;
}
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
ID : ('a'..'z' | 'A' .. 'Z' | '0' .. '9')+ ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { Skip(); } ;
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
expr : multExpr ((PLUS | MINUS)^ multExpr)*;
multExpr : atom ((MULT | DIV)^ atom )*;
atom : ID
| '(' expr ')' -> expr;
これで、ツリー構造を作成するための定義済みのタイプがいくつかあります。
public class Expr { }
public class SimpleExpr : Expr
{
public SimpleExpr(string name) { ... }
}
public enum BinaryExprType
{
Plus,
Minus,
Multiply,
Divide
}
public class BinaryExpr : Expr
{
public BinaryExpr(Expr left, BinaryExprType op, Expr right) { ... }
}
CommonTree
をツリーに変換するコードを記述できることはわかっていますがExpr
、次のようなカスタム型に直接書き直したいと思います。
atom returns [Expr e]
: ID { $e = new SimpleExpr($ID.text); }
| '(' expr ')' { $e = $expr.e; };
expr returns [Expr e]
: /* ??? */;
multExpr returns [Expr e]
: /* ??? */;
しかし、適切なを使用expr
しmultExpr
て作成するにはどうすればよいですか?BinaryExpr
BinaryExprType