2017-08-06 110 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上下文。