2015-08-14 20 views
1

我試圖編寫一些特定格式的消息的編譯器。 如果我把它簡化我的問題是:如何解決在javacc中的相同標記開始的兩個選擇之間的衝突

< WORD : ([LETTER]){2,5}> 
< ANOTHER_WORD : (<LETTER>|<DIGIT>){1,5}> 
< SPECIAL_WORLD : "START"> 

void grammar(): 
{ 
} 
{ 
<WORD><ANOTHER_WORD> 
| <SPECIAL_WORD><ANOTHER_WORD> 
} 

這裏我特別的詞總是一致的WORD這是合乎邏輯的,當然,但由於衝突是在生產的開始,我不知道如何解決它。 一些幫助,將不勝感激。

+0

在第一行中,應該將[[LETTER]]設爲''? –

回答

1

首先將規則START。像大多數詞彙掃描生成器一樣,JavaCC使用最長可能的標記匹配被選中的規則,然後,如果應用了兩個或更多模式,則選擇其中的第一個。

因此,您的ANOTHER_WORD規則只會在WORD不匹配時匹配,因此它只會匹配長度爲1或包含數字的單詞。

看起來您希望解析器狀態影響識別詞法標記的方式。一般來說,這不是詞彙掃描程序的工作方式,但您可以使用lexical states實施有限的上下文掃描。

+0

謝謝,改變順序實際上解決了這個問題(但是又用另一個標記創造了另一個模糊性) –

相關問題