我正在使用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沒有規則錯誤。我想,解析器語法根本不喜歡解析器中定義的令牌。所以,我在詞法分析器中定義了它。再次,這失敗了。然後,我在詞法分析器和解析器中定義了每個標記 - 再次,失敗。
所以,這是我需要知道的。當詞法分析器和解析器分離時,是否有方法來定義虛構標記?如果沒有,是將語法和詞法分析器結合到同一個文件中的唯一選擇嗎?
啊,是的,那一定是它,當然! – 2013-03-25 15:18:13
當然是。在轉發給我這個答案之後,我可以看到這在ANTLR4中有記錄,但是我沒有在ANTLR3的任何地方看到它。感謝善良的stackoverflow。謝謝。 – Ajaxx 2013-03-26 04:23:55