我對ANTLR非常陌生,並且試圖理解Lexer和Parser規則是如何工作的。我遇到了一個我寫過的語法問題,它似乎與多個字符被視爲「匹配」的詞法分析符號相關,即使只有前幾個字符實際匹配時也是如此。爲了證明這一點,我寫了一個簡單的ANTLR 3語法:ANTLRv3沒有閱讀選項
grammar test;
options {
k=3;
}
@lexer::header { package test;}
@header {package test;}
sentence : (CHARACTER)*;
CHARACTER : 'a'..'z'|' ';
SPECIAL : 'special';
我使用AntlrWorks來分析下面的測試輸入:
apple basic say sponsor speeds speckled specific wonder
我得到的輸出是:
apple basic say nsor ds led ic wonder
在我看來,LEXER使用k = 1,因此將我的SPECIAL標記與包含兩個字母'sp'的任何東西進行匹配。一旦遇到字母'sp',它就會匹配SPECIAL文字中的成年字符,直到實際輸入不符合預期的標記爲止 - 此時它會拋出一個錯誤(消耗該字符),然後繼續處理其餘的句子。每個錯誤的形式如下:
line 1:18 mismatched chracter 'o' expecting 'e'
但是,這不是我嘗試創建的行爲。我希望創建一個與關鍵字('special')匹配的詞法分析器標記,以用於此測試示例中未包含的其他分析器規則。不過,我不希望其他規則/輸入,只是碰巧包括相同的初始人物受到影響
總結:
- 實際上,我怎麼設置ANTLR 3個選項(如K = 2或k = 3等)?至少在我看來,我嘗試在這裏使用的選項沒有設置。
- 有沒有更好的方法來創建解析器或詞法分析器規則來匹配我的輸入中的特定關鍵字,而不會影響輸入中不包含完整匹配的其他部分的處理?
當我在ANTLRWorks 1.4.2中運行你的示例時,它解析得很好,你指的是什麼輸出? – 2011-05-16 06:17:26
這很有趣,@Bas。我也使用ANTLRWorks 1.4.2(通常在IntelliJ 10.0.3中運行)。在調試模式下,我有一個顯示錯誤的「輸出」選項卡。我還可以檢查分析樹(Parse Tree選項卡)以查看「spe ..」位被丟棄。同樣,「堆棧選項卡」顯示我的機器上的問題。你的沒有出現任何問題嗎?你能檢查ParseTree並看到完整的句子,包括以字母「spec ...」開始的位嗎? – Glennn 2011-05-16 07:23:05
我使用解釋器選項卡時,它會在您的示例輸入上運行語句規則時生成解析樹。 – 2011-05-16 07:30:01