我正在编写一个非常基本的编译器/解析器作为学习项目。
grammar C;
file: expr;
expr: '(' expr ')' # parens
| '-'<assoc=right> expr # Negate
| expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub
| INT # int
;
INT: '0' | [1-9][0-9]*;
WS: [ \t\n\r] -> skip;
以下是否定操作
的事件示例public override void ExitNegate([NotNull] CParser.NegateContext context)
{
var children = context.children;
if (children[1].ChildCount == 1)
{
assembler.Mov32RI(allocator.AllocateRegister().ToString().ToLower(), -int.Parse(children[1].GetText()));
}
else
{
assembler.NegateR(allocator.Top().ToString());
}
base.ExitNegate(context);
}
我正在使用
children[1].ChildCount == 1
基本上意味着'如果孩子是一个int',因为这是我唯一可能意味着在这种情况下(我认为)的语法规则。有没有办法在这种情况下获取表达式令牌,所以我实际上在寻找INT?在更复杂的语法中,我希望我的逻辑更明确。
编辑:我不是在寻找语法的改进,但是如何在侦听器中使用context参数来确定表达式部分是否是整数(理想情况下我认为检查INT令牌)。
答案 0 :(得分:0)
在ExitNegate
中,您显然只能得到一个expr
节点,因为这是您的语法指定的。您可以在该上下文中向下钻取,直到找到一个离开节点,然后是您的INT
令牌。
然而,听取Exitint
可能更有意义,而您可以确定这是您正在寻找的INT
。如果有疑问,您可以检查给定上下文的父级,以查看它是否是expr
上下文。