2013-07-07 58 views
0

我有以下語言來定義,顯然ANTLR沒有泄露它的祕密,以方便。antlr匹配不同的括號中的部分

ui { 
    screen X { 
    input() 
    checkbox() 
    } 
} 
model { 
// any text 
// even {} 

} 

我會定義

ui: UI OBR (screen)* CBR; 

screen: .... 

model : MODEL modelBody; 

modelBody: BRACKETED_TEXT; 

OBR: '{'; 
CBR: '}'; 
... 
TEXT : ('a'..'z'|'A'..'Z'| '_' | '-')+ ; 
BRACKETED_TEXT : OBR (~(OBR|CBR) | BRACKETED_TEXT)* CBR; 

的問題是,它擊中ui {一部分時,拋出一個MismatchedTokenException。如果我刪除BRACKETED_TEXT令牌一切順利,那麼我認爲它必須是它在分析ui {時無法知道它是否可以匹配OBR或BRACKETED_TEXT的事實。

這很好,但我怎麼能有ui {...}的結構化AST和model {..}的自由文本?

回答

0

OK,得到的答案是這樣的:

ui: UI OBR (screen)* CBR; 

screen: .... 

model : MODEL modelBody; 

modelBody: genericBlock; // no more BRACKETED_TEXT 

genericBlock 
: OBR 
    (TEXT 
    | QUOTED_TEXT 
    | OPAR 
    | CPAR 
    | genericBlock 
)* 
CBR 
; 

OBR: '{'; 
CBR: '}'; 
OPAR: '(';// this was part of the initial grammar file, but left out 
CPAR: ')';// same here 
... 
TEXT : ('a'..'z'|'A'..'Z'| '_' | '-')+ ; 

問題仍然存在,我希望有人能清除它。爲什麼我必須聲明通用塊中不會出現的所有標記?如果詞法分析器在genericBlock內遇到已聲明的TOKEN,則失敗。爲什麼我特意告訴它匹配除OBRCBR以外的任何其他內容。

+0

你可以「接受」你自己的答案.... –