2012-04-26 85 views
1

我想解決如何處理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;}; 

我需要處理BIDB:B作爲idB前綴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

+0

好了,所以你需要的東西是這樣的:「B:B」當你需要的時候將其標識爲ID和「B」的發生:「B B:」,並在AST「B」和這樣的事情發生你需要將它識別爲帶有前綴的ID?我是否正確 – sm13294 2012-04-26 11:35:23

+0

是的,你說得對! – Overdose 2012-04-26 11:40:04

回答

1

我不會和任何人去。我會簡單地創建ID令牌和B令牌(或創建PREFIX_VAR令牌:這屬於解析器)。

可以搭配使用在解析器規則這樣的多義性語義謂詞 資本B(capB):

grammar Test; 

goal 
: (prefixVar | ID)+ EOF 
; 

prefixVar 
: capB ':' ID 
; 

capB 
: {input.LT(1).getText().equals("B")}? ID 
; 

ID : LETTER+; 
WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}; 

fragment LETTER: 'A'..'Z' ; 

這將解析輸入B:B B B:C分爲以下分析樹:

enter image description here

What is a 'semantic predicate' in ANTLR?

0

試試這個:

grammar PrefixProblem; 


options  
{ 
language = Java; 
} 

goal: (size_prefix ':')? (id|B); 

size_prefix: B; 

id: LETTER+; 

LETTER: 'A'|'C'..'Z' ; 

B: 'B'; 

WSFULL:(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}; 
+0

實際上,它與PrefixSolution1有相同的含義,它需要剝離詞法分析器,我想避免使用 – Overdose 2012-04-26 11:45:39

+0

哦,是的,對不起,我只是意識到我來到第二個解決方案。我會盡力做一些事情 – sm13294 2012-04-26 11:47:36