2012-01-31 51 views
1

我需要描述包含某個詞的令牌。該單詞可能包含英文字母和一些其他特殊符號,但不應以某些定義的英文字母(例如,「O」)開頭。javacc令牌正則表達式and_symbol_in

看起來我需要AND_SYMBOL_IN操作或其他東西,但我沒有找到JavaCC的文檔中 我需要的行爲是這樣的:?

TOKEN : { < LETTERS: (
    (~["O", "-"] AND_SYMBOL_IN ["a"-"z","A"-"Z","-",".","&","|","0"-"9"])? (["a"-"z","A"-"Z","-",".","&","|","0"-"9"])+ 
) > } 

我可以創造特殊的記號(如下面),但我相信有更多好看的決定,isn`t它

TOKEN : { < #LETTEREX: (
["a"-"z","A"-"N","P"-"Z",".","&","|","0"-"9","-"]) > } 

TOKEN : { < LETTERS: (
(<LETTEREX>) (<LETTEREX> | ["O"])+ 
) > } 
+0

互聯網似乎沒有描述'AND_SYMBOL_IN'的文檔,所以如果沒有JavaCC的個人知識,我們不能幫你。 – Borodin 2012-01-31 13:39:07

+0

我懷疑是否有'更好'(即更簡潔)的解決方案 - 你想要的是在令牌識別中迭代正則表達式匹配。我不認爲任何人都會爲一個詞法生成器一般地實現這個功能。它可能是unicode上下文中的一些特殊需求所期望的,但對於您的任務,我建議堅持您的解決方案。另一個選擇可能是設置TOKEN_FACTORY並在匹配'word'時調整'newToken'返回不同的標記 - 請參閱javacc文檔。希望有所幫助,關心 – collapsar 2012-02-01 12:10:07

回答

2

JavaCC解決ambiguigu在相同大小的匹配之間使用匹配令牌在語法中聲明的順序。所以,一種可能性是,以配合你不令牌之前需要令牌你做:

例如:

TOKEN : { < #LETTER : ["a"-"z","A"-"Z","-",".","&","|","0"-"9"] > } 
TOKEN : { < WORDS_STARTING_WITH_O : "O" (<LETTER>)+ > } 
TOKEN : { < WORDS_NOT_STARTING_WITH_O : (<LETTER>)+ > } 

如何適合這取決於你有多少特殊情況和多麼複雜,他們是。

相關問題