Regex javacc令牌正则表达式和符号

Regex javacc令牌正则表达式和符号,regex,javacc,Regex,Javacc,我需要描述包含一些单词的标记。这个词可以包含英文字母和其他一些特殊符号,但不应以某些已定义的英文字母开头(例如“O”) 它看起来像是我需要和_SYMBOL _在运行中或其他什么东西,但我还没有在javacc文档中找到它。 我需要这样的行为: TOKEN : { < LETTERS: ( (~["O", "-"] AND_SYMBOL_IN ["a"-"z","A"-"Z","-",".","&","|","0"-"9"])? (["a"-"z","A"-"Z","-",".",

我需要描述包含一些单词的标记。这个词可以包含英文字母和其他一些特殊符号,但不应以某些已定义的英文字母开头(例如“O”)

它看起来像是我需要和_SYMBOL _在运行中或其他什么东西,但我还没有在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"])+
) > }
TOKEN:{<#LETTEREX:(
[“a”-“z”、“a”-“N”、“P”-“z”、“、”、“&”、“|”、“0”-“9”、“-”])>
标记:{<字母:(
()(|[“O”])+
) > }

JavaCC使用语法中声明匹配标记的顺序来解决大小相同的匹配之间的歧义。因此,一种可能性是先匹配您不想要的标记,然后再匹配您想要的标记:

例如:

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

这是否合适取决于您有多少特殊情况以及这些情况有多复杂。

互联网上似乎没有一个文档在中描述
和\u SYMBOL\u,因此如果没有个人对JavaCC的了解,我们无法帮助您。我怀疑是否有“更好”(即更简洁)的文档解决方案-您想要的相当于令牌识别中的迭代regexp匹配。我不相信有人会为lexer生成器一般性地实现该功能而烦恼。对于unicode上下文中的某些特殊需要,这可能是可取的,但对于您的任务,我建议您坚持使用您的解决方案。另一个选项可能是设置OKEN_工厂,并调整
newToken
以在匹配“单词”时返回不同的标记-请参阅javacc文档。希望对您有所帮助,敬请期待