1
我正在编写一个非常基本的编译器/解析器作为学习项目。ANTLR如何获得表达式令牌
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?在更复杂的语法中,我希望我的逻辑更加明确。
编辑:我没有在语法上寻找改进,但我如何在侦听器中使用上下文参数来确定表达式部分是否是整数(理想情况下,我认为检查INT令牌)。