2016-04-14 31 views
0

我有其中我寫的詞法標記爲一要求:如果ANTLR與任何已定義的令牌不匹配,是否有可用的默認令牌?

IF_LEXER_TOKEN: ('I')('F') (.)* ('E')('N')('D')_('I')('F') 
ANY :(options {greedy=true;}: .)* ; 

但如果輸入給定爲:

IF a>b then a=b END_IF 
IF c>d then c=d 

在這種情況下,預期的行爲是它應該使用令牌第一行爲IF_LEXER_TOKEN,第二行爲ANY標記,但相反,它考慮了兩行的ANY標記。 請幫忙。 注意:由於某些限制,我無法爲以上方案中的 創建解析器規則。

+0

爲什麼你將所有的單個字母標記放入一個自己的括號中?看起來很奇怪。 –

回答

1

不,沒有這樣的默認令牌。但是你可以很容易地創建它:

ANY: .*?; 

最好是讓這個非貪婪,以允許輸入後,其他標記匹配。順便說一句:在詞法分析器中定義一個完整的序列有幾個缺點,例如如果詞法分析規則失敗,錯誤報告不能給您一個很好的理由。您必須明確處理所有空格。你放棄了這樣的原則,通常它們之間存在多少個空格(包括換行符)並不重要。

+0

謝謝你的回覆。我試着創建上面的標記,但是它拋出了一個SystemOutOfRange異常:不能向後看多個標記。 – shruti

+0

這種捕獲所有規則必須是最後的詞法分析規則。如果它有所作爲,請嘗試貪婪的方法。 –

+0

規則任何:。*?拋出語法錯誤:NoViableAltException。它是你提到的最後的詞法分析規則。 – shruti