2016-09-22 96 views
1

我有一些數據需要解析。我使用ANTLR4工具來自動生成Java解析器和詞法分析器,我可以使用,以形成從輸入數據低於 語法給出一個結構化的數據:ANTLR4語法不像預期的那樣運行

grammar SUBDATA; 
subdata: 
    data+; 
data: 
    array; 
array: 
    '[' obj (',' obj)* ']'; 
intarray: 
    '[' number (',' number)* ']'; 
number: 
    INT; 
obj: 
    '{' pair (',' pair)* '}'; 
pair: 
    key '=' value; 
key: 
    WORD; 
value: 
    INT | WORD | intarray; 
WORD: 
    [A-Za-z0-9]+; 
INT: 
    [0-9]+; 
WS: 
    [ \t\n\r]+ -> skip; 

測試輸入數據:

[ 
    {OmedaDemographicType=1, OmedaDemographicId=100, OmedaDemographicValue=4}, 
    {OmedaDemographicType=1, OmedaDemographicId=101, OmedaDemographicValue=26}, 
    { 
     OmedaDemographicType=2, OmedaDemographicId=102, OmedaDemographicValue=[16,34] 
    } 
] 

輸出繼電器:

line 5:79 mismatched input '16' expecting INT 
line 5:82 mismatched input '34' expecting INT 

GUI Tree O/P

解析器失敗,雖然我有以上預期位置的整數值。

回答

2

你犯了一個經典的錯誤,沒有正確地命令你的詞法分析規則。您應該閱讀並理解priority rules及其後果。

在你的情況,INT永遠能夠匹配,因爲WORD規則可以匹配一切INT規則就可以了,它的第一個定義的語法。這些例子中的1632WORDs。

你應該通過不允許一個字以數字開頭消除不確定性:

WORD: 
    [A-Za-z] [A-Za-z0-9]*; 
INT: 
    [0-9]+; 

或交換的規則的順序:

INT: 
    [0-9]+; 
WORD: 
    [A-Za-z0-9]+; 

在這種情況下,你可以」沒有完全數字的單詞,但他們仍然能夠以數字開頭。

+0

感謝您的回答。我認爲這是解析器規則中關於匹配的詞法令牌的順序。我認爲更多的是用正則表達式忽略這樣一個事實,即在匹配解析器規則本身之前生成第一個詞法標記 –

+0

除了盧卡斯的答案之外:如果在解析中發現意外行爲,則始終通過查看詞法分析器生成的標記開始解決它們。這會告訴你令牌序列與你預期的不同。 –

相關問題