2013-03-25 40 views
1

我正在使用ANTLR構建AST,並基於分離的Java6詞法分析器&語法。詞法分析器定義包含在Java6Lex.g中,併產生語法消耗的令牌。解析器消耗這些沒有問題,但是當我生成AST時,我想介紹想象的令牌 - 但是,似乎ANTLR不喜歡該模型。如何爲單獨的ANTLR詞法分析器和分析器添加虛構令牌?

解析器語法包括來自詞法分析器的標記詞彙表 - 這應該將可用於語法的標記作爲基準。

parser grammar Java6Parse; 

options { 
    tokenVocab=Java6Lex; 
    backtrack=true; 
    memoize=true; 
    output=AST; 
    language = CSharp3; 
} 

現在,讓我們說,我想借此fieldDeclaration和使用重寫規則把它變成一個根深蒂固的節點。我認爲(顯然錯誤的),我可以直接導入虛令牌到解析器語法如下:

fieldDeclaration 
    : modifiers type variableDeclarator (COMMA variableDeclarator)* SEMI 
      -> ^(FIELD modifiers type variableDeclarator+) 
    ; 

然而,這僅僅導致下面的錯誤發生:

reference to undefined token in rewrite rule: FIELD 

沒問題,我明白了,我沒有定義它。所以,我嘗試在解析器語法的令牌部分中定義它。再一次,錯誤地思考,tokenVocab應該提供一個基線。

tokens { FIELD; } 

不,似乎連限定在EarlyExitException一個令牌塊的結果和指示Java6Parse.g沒有規則錯誤。我想,解析器語法根本不喜歡解析器中定義的令牌。所以,我在詞法分析器中定義了它。再次,這失敗了。然後,我在詞法分析器和解析器中定義了每個標記 - 再次,失敗。

所以,這是我需要知道的。當詞法分析器和解析器分離時,是否有方法來定義虛構標記?如果沒有,是將語法和詞法分析器結合到同一個文件中的唯一選擇嗎?

回答

3

您很可能會在錯誤的位置包含tokens{}塊。 ANTLR 3要求語法標題元素以特定順序出現。看到這個堆棧溢出的答案正確的順序:

Using @header in ANTLR

+0

啊,是的,那一定是它,當然! – 2013-03-25 15:18:13

+0

當然是。在轉發給我這個答案之後,我可以看到這在ANTLR4中有記錄,但是我沒有在ANTLR3的任何地方看到它。感謝善良的stackoverflow。謝謝。 – Ajaxx 2013-03-26 04:23:55

相關問題