2016-11-25 57 views
2

我試圖解析以下文本格式解析`任何string`:ANTLR4 - 不消耗整個輸入

<identifier> { 
    <identifier> : <any-text-without-white-space-or-new-line> : <identifier> 
    <identifier> : <identifier>.<identifier> 
} 

例如:

john { 
    name : JohnJohnson.12.453.643-USA[NewYork] : default 
    reference : something.else 
} 

我已經創建瞭如下語法:

SPACE   : [ \t\r\n]+ -> skip; 
LEFT_BRACE  : '{'; 
RIGHT_BRACE : '}'; 
COLON   : ':'; 
DOT   : '.'; 
ID    : [a-z]+ 
ANY   : ~(' '|'\t'|'\r'|'\n')+; 

outer   : ID LEFT_BRACE inner_first inner_second RIGHT_BRACE EOF; 
inner_first : ID COLON (ANY | ID) COLON ID; 
inner_second : ID COLON ID DOT ID; 

這個語法的問題是<identifier>.<identifier>在第二行的輸入被識別爲

ANY 

,而不是作爲

ID DOT ID 

我可以解決這個問題,如果我改變的ANY的定義:

ANY   : ~(' '|'\t'|'\r'|'\n'|'.')+; 

但這意味着.符號不能再作爲第一行中任意文本的一部分。

這看起來像一個雞/雞蛋問題。這是可以解決的嗎?

(FWIW,我讀了偉大的書The Definitive ANTLR 4 Reference我買前一段時間,但我還沒有找到一個解決辦法呢。)

回答

0

你總是可以有記號化的最小量的詞法規則,並有一定的解析器規則,而不是詞法分析規則來表示任何你想要的組合。比方說:

my_desired_seq  : NON_WS_CRLF_DOT_SEQ DOT NON_WS_CRLF_DOT_SEQ ; 
NON_WS_CRLF_DOT_SEQ  : ~(' '|'\t'|'\r'|'\n'|'.')+; 

和語法的另一部分使用的解析器規則,而:

inner_second : ID COLON my_desired_seq;