2014-12-03 44 views
2

我建立以下語法:ANTLR的預測-LL(*)解析機制

Letter  : 'a'..'z'|'A'..'Z'  ; 

Number  : '0'..'9'  ; 

Float 
    : Number+ '.' Number+ 
    ; 

a5 
@init 
{ 
int n = 1; 
} 
: ({n<=5}?=>(Letter|Number){n++;})+ 
; 

它沒有成功解析字符串「CD923IJK」,因爲我需要被消費「CD923」,而不是「CDIJK 「就像如果浮子評論問題消失和消費發生

‘CD923’像我想要

顯然需要一種先進的分析,因爲這個語法LL(K),我設定先行深度

options 
{ 
k=5; 
} 

但是沒有解決任何問題。任何想法?

UPDATE

響應於建議500 - Internal Server Error 添加以下規則

public test :a5 Float ; 

我需要匹配CD9231.23其中CD923是字母數字和1.23的浮子。但見解析樹: enter image description here

+1

這是你真正的語法和輸入?這是我沒有看到'浮動'規則如何匹配任何輸入,因爲你沒有一個點。 – 2014-12-03 20:11:41

+0

@ 500-InternalServerError這是我的語法片段。問題是爲什麼發生這種情況。爲什麼「123」被跳過並在鏈條後面的3個字母中消耗? – Cyberguille 2014-12-05 14:11:25

+0

我的建議是將語法縮減爲您可以在此處完整發布的內容以及失敗的輸入。 – 2014-12-05 14:26:52

回答

1

問題似乎在規則數字和浮點數。你在這兩條規則中有一個不明確的地方,但由於Number和Float都是詞法規則,所以你必須記住antlr隱式地創建一個nextToken規則來處理所有的標記。該的nextToken的例子是這樣的:

nextToken: Letter | Number | Float; 

當ANTLR找到一個數字,他通過DFA步行至哪個治跳,但在這種情況下,他不能確定哪些是正確的規則(或數浮動)跳轉到。您可以避免使Float規則成爲解析器規則的行爲。你可以試試這樣的:

grammar a5; 

s : a5 coordinate? 
    ; 

a5 
@init{ 
int n = 0; 
} 
: ({n<5}?=> (LETTER|Number){n++;})+ 
; 


Number : '0'..'9' 
    ; 

coordinate : Number+ '.' Number+ 
    ; 

LETTER 
    : 'a'..'z'|'A'..'Z' 
    ; 
1

我想,也許你可以做一個簡單的解決方案:如果你知道你的A5規則的項目始終將大小5的文本或更少,你可以根據所編寫規則:

A5 
: (Letter|Number)(Letter|Number)(Letter|Number)(Letter|Number)(Letter|Number) 
    | (Letter|Number)(Letter|Number)(Letter|Number)(Letter|Number) 
    | (Letter|Number)(Letter|Number)(Letter|Number) 
    | (Letter|Number)(Letter|Number) 
    | (Letter|Number) 
; 

其他的解決辦法是讓規則沒有考慮帳戶的lenthg,然後檢查它在語義階段:

AK 
    : (Letter|Number)+ 
; 

這有一些想法,希望可以幫助...