我想解決如何處理ANTLR
中的含糊之處。 我需要正確解析大小前綴的標識符或標識符。 首先,我想出了這個車語法最佳歧義解決
grammar PrefixProblem;
options
{
language = Java;
}
goal: (size_prefix ':')? id;
size_prefix: B;
id: LETTER+;
LETTER: 'A'..'Z' ;
B: 'B';
WSFULL:(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};
我需要處理B
爲ID
,B:B
作爲id
B
前綴B
。它沒有工作。
然後我發現了兩個解決這個問題的方法。
grammar PrefixSolution1;
options
{
language = Java;
}
goal: (size_prefix ':')? id;
size_prefix: B;
id: (LETTER | B)+;
LETTER: 'A' | 'C'..'Z' ;
B: 'B';
WSFULL:(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};
在上述B
的代碼是從lexer
規則取出並在id
規則串聯。
grammar PrefixSolution2;
options
{
language = Java;
}
goal: PREFIX_VAR;
PREFIX_VAR: (B WSFULL* ':' WSFULL*)? ID;
fragment ID: (LETTER)+;
fragment LETTER: 'A'..'Z' ;
fragment B: 'B';
WSFULL:(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};
在這裏,我剛搬到一個規則的lexer
。
PrefixSolution1
有主騙子,我需要帶詞法規則成小塊,再後來concatecate。
PrefixSolution2
:這種方法會導致我總是需要採取哪些應該被忽略的帳戶空白字符。
至於我,這兩種解決方案會導致大混亂編寫語法的整體語言。還有其他解決方案嗎?如果不是,哪種方式是最優化的?
所有的源代碼都可以here
好了,所以你需要的東西是這樣的:「B:B」當你需要的時候將其標識爲ID和「B」的發生:「B B:」,並在AST「B」和這樣的事情發生你需要將它識別爲帶有前綴的ID?我是否正確 – sm13294 2012-04-26 11:35:23
是的,你說得對! – Overdose 2012-04-26 11:40:04