2012-01-09 66 views
1

請參閱下面的語法。當我嘗試解析:當其他字符需要優先時ANTLR匹配字符?

String s = "UNH+message refere+APERAK:D:97A:UN\n"; 

我得到以下錯誤:

line 1:34 mismatched character '\n' expecting 'H' 
line 2:0 missing RDEL at '<EOF>' 

這沒有意義對我來說,因爲它似乎是在尋找UNH遇到之前\ n,這將不遵循'文件'規則。

grammar Aperak; 

    options { 
     language = Java; 
    } 

    @header { package test.fixed.aperak; } 
    @lexer::header { package test.fixed.aperak; } 

    file returns [String result]: 'UNH' unh01 unh02 RDEL { $result = $unh01.text + " -- " + $unh02.text; }; 

    unh01 : FDEL optField; 
    unh02 : FDEL unh02x1 unh02x2 unh02x3 unh02x4 (unh02x5)?; 
    unh02x1 : optField; 
    unh02x2 : SDEL optField; 
    unh02x3 : SDEL optField; 
    unh02x4 : SDEL optField; 
    unh02x5 : SDEL optField; 

    optField : AN*; 

    RDEL : '\n'; 
    SDEL : ':'; 
    FDEL : '+'; 

    AN : 'a'..'z' | 'A'..'Z' | '0'..'9' | ' '; 

回答

1

你詞法真的是這樣的:

UNH : 'UNH'; 
RDEL : '\n'; 
SDEL : ':'; 
FDEL : '+'; 
AN : 'a'..'z' | 'A'..'Z' | '0'..'9' | ' '; 

file規則的字面'UNH'成爲詞法分析規則放在所有其他詞法分析規則之上。

當詞法分析器現在發現"UN"後面跟着"H"以外的東西時,它會產生一個錯誤,因爲詞法分析器無處可返回。如果您的AN規則匹配了多個單個字符,則詞法分析器可以遵循該規則,但由於它只匹配單個字符,詞法分析器不會從"UN"回溯。

由於dasblinkenlight已經提示是正確的:AN應該匹配1個或多個字符,然後optField可以匹配可選的AN。他(或她)的答案的另一部分不太正確,因此我的答案。

1

我認爲ANTLR得到具有兩個重疊的規則覆蓋UNH輸入真正困惑:

  • 單個令牌UNH,或
  • AN類型的三個令牌的序列,與文本"U""N",和"H"

我薄K優應該修改optFieldAN規則爲*進入詞法分析器,像這樣:

optField : AN?; 

AN : ('a'..'z' | 'A'..'Z' | '0'..'9' | ' ')+; 
+0

你的修正是正確的,但答案並不完全正確:詞法分析器不會因爲三個標記而感到困惑:這些標記(「U」,「N」,「H」)將會不會被創建。在嘗試從輸入'UNx'(其中'「x」是除「H」之外的任何其他輸入)創建一個'UNH'標記後,詞法分析器無處可回,因爲'AN'匹配單個字符。 – 2012-01-10 08:43:00

+0

@BartKiers我沒有說三個標記*會被創建,只是有一個規則可以用來將字符串UNH解釋爲三個標記的序列。對我來說,「詞法分析器無處可回」是一種明智的方式來說「詞法分析器變得困惑」:) – dasblinkenlight 2012-01-10 12:20:48

+0

你說:*「一個由三個」AN「類型的標記組成的序列,其中帶有」U「 ,''N「',和'」H「'」* ...或許你的意思是我剛纔所說的,但措辭表明了我之前評論的內容。 – 2012-01-10 12:42:42