2011-06-14 84 views
2

如果我有一個ANTLR語法如下:似乎非確定性在ANTLR解析

grammar Test; 
options { 
    language = Java; 
} 

rule : (foo | bar); 


foo : FOO ',' FOO; 
bar : BAR; 

FOO: ('0'..'9')+; 
BAR: ('a'..'z' | 'A'..'Z' | '0'..'9' | ' ')+; 
WHITESPACE: (' ' | '\t')+ { $channel=HIDDEN; }; 

我使用測試字符串:

12abc3

這(我相信)是BAR令牌,其滿足bar規則並且被如此解析。布拉沃。

但是,如果我有這樣的字符串:

12 

我收到line 1:2 mismatched input '' expecting ','

這似乎相當不確定性,雖然我敢肯定它不是。我知道我已經有兩個令牌:FOOBAR接受數字。但是,如果解析器要成功或失敗,它應該一致成功或失敗。換句話說,在第一種情況下,第一個字符是1,顯然是作爲BAR令牌的成員進行評估,因此解析器將成功通過一條路徑。在第二種情況下,同一個第一個字符被評估爲FOO令牌,因此該路徑註定會失敗,儘管該字符串可能是成功的bar解析。爲什麼不一致?或者我錯過了更關於ANTLR和/或解析的基礎知識?

回答

3

ANTLR不會確定標記類型,直到它看到下一個標記(或EOF)的第一個字符。 ANTLR也將嘗試最長的比賽,這就是爲什麼你看到'12abc3'爲BAR而不是FOO BAR。在第二種情況下,ANTLR將使用FOO作爲'12',因爲它在語法中首先列出。

ANTLR basics

ANTLR lexers

0

除了亞當回答,你必須認識到,詞法和語法分析器,雖然在相同的語法定義,正在以不同的時間結構。首先輸入源被標記化,當發生這種情況時,只有解析器對這些標記進行操作。標記而不是在解析器經歷源(字符流)以支持完整匹配(即,標記化"12"作爲BAR)時創建。 "12"被標記爲FOO這一事實是因爲FOOBAR規則之前,並且因此在長度相等的情況下具有更高的優先級。

總之:ANTLR語法是不是PEG's。