2017-08-06 71 views
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令牌)。

回答

0

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

但是,如果您确实知道这是您正在查找的INT,则倾听Exitint可能更有意义。如果有疑问,您可以检查给定上下文的父级以查看这是否为expr上下文。