ANTLR如何获取表达式令牌

时间:2017-08-06 19:52:52

标签: c# 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?在更复杂的语法中,我希望我的逻辑更明确。

编辑:我不是在寻找语法的改进,但是如何在侦听器中使用context参数来确定表达式部分是否是整数(理想情况下我认为检查INT令牌)。

1 个答案:

答案 0 :(得分:0)

ExitNegate中,您显然只能得到一个expr节点,因为这是您的语法指定的。您可以在该上下文中向下钻取,直到找到一个离开节点,然后是您的INT令牌。

然而,听取Exitint可能更有意义,而您可以确定这是您正在寻找的INT。如果有疑问,您可以检查给定上下文的父级,以查看它是否是expr上下文。