我需要描述包含一些单词的标记。这个词可以包含英文字母和一些其他特殊符号,但不应该以一些定义的英文字母开头(例如,'O')。
看起来我需要AND_SYMBOL_IN操作或其他东西,但我还没有在javacc文档中找到它。 我需要这样的行为:
TOKEN : { < LETTERS: (
(~["O", "-"] AND_SYMBOL_IN ["a"-"z","A"-"Z","-",".","&","|","0"-"9"])? (["a"-"z","A"-"Z","-",".","&","|","0"-"9"])+
) > }
我可以创建特殊令牌(如下所示),但我相信还有更好的决定,不是吗?
TOKEN : { < #LETTEREX: (
["a"-"z","A"-"N","P"-"Z",".","&","|","0"-"9","-"]) > }
TOKEN : { < LETTERS: (
(< LETTEREX > ) (< LETTEREX > | ["O"])+
) > }
答案 0 :(得分:2)
JavaCC使用在语法中声明匹配标记的顺序解决了大小相等的匹配之间的歧义。因此,有一种可能性是在您执行令牌之前匹配您不想要的令牌:
例如:
TOKEN : { < #LETTER : ["a"-"z","A"-"Z","-",".","&","|","0"-"9"] > }
TOKEN : { < WORDS_STARTING_WITH_O : "O" ( < LETTER > )+ > }
TOKEN : { < WORDS_NOT_STARTING_WITH_O : (< LETTER > )+ > }
这是多么合适取决于你有多少特殊情况以及它们有多复杂。