我已经在 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) { ... }
}
我知道我们可以编写一些代码来将 a 转换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