2012-01-31 61 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>)+ > } 

如何适合这取决于你有多少特殊情况和多么复杂,他们是。

相关问题