1

我需要描述包含一些单词的令牌。该单词可以包含英文字母和其他一些特殊符号,但不应以某些已定义的英文字母开头(例如,“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"])+
) > }
4

1 回答 1

2

JavaCC 使用在语法中声明匹配标记的顺序来解决大小相等的匹配之间的歧义。所以一种可能性是在你做的令牌之前匹配你不想要的令牌:

例如:

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

这有多合适取决于您有多少特殊情况以及它们有多复杂。

于 2012-03-19T17:06:39.840 回答