JavaCC:令牌定义中的多个相等字符

JavaCC:令牌定义中的多个相等字符,java,regex,token,lexer,javacc,Java,Regex,Token,Lexer,Javacc,在JavaCC中,我如何定义由重复字符组成的令牌,如下图所示: “…” 对应于什么 或 “:” 对应于什么 或 “/” 对应于什么 等等 JavaCC编译器允许我在没有警告消息的情况下定义这些标记,但一旦我在另一个词汇标记规则中使用这些标记,其中该定义是一个备选方案,我就会收到警告。见下文: 在我写作时考虑到上述规则 TOKEN : { TestToken : <DoubleColon> } TOKEN : { TestToken : "test" | <DoubleColo

在JavaCC中,我如何定义由重复字符组成的令牌,如下图所示:

“…”
对应于什么

“:” 对应于什么

“/” 对应于什么

等等

JavaCC编译器允许我在没有警告消息的情况下定义这些标记,但一旦我在另一个词汇标记规则中使用这些标记,其中该定义是一个备选方案,我就会收到警告。见下文:

在我写作时考虑到上述规则

TOKEN : { TestToken : <DoubleColon> }
TOKEN : { TestToken : "test" | <DoubleColon> }

没有任何成功。它也有同样的效果。

我确实找到了一个比预期更简单的解决方案:

为了定义由多个相等字符组成的标记,可能只需要定义此特定字符的一个实例

e、 g

TOKEN:{}
然后,要执行以下操作:

TOKEN : { < TrippleSlash : <Slash><Slash><Slash> > }
TOKEN:{}
我已经对它进行了编码和测试,它似乎工作得很好。

您需要的是“私有正则表达式”。看

因此,您可以执行以下操作

TOKEN : { #DoubleColon : "::" }
TOKEN : { TestToken : "test" | <DoubleColon> }
标记:{#双冒号::“}
令牌:{TestToken:“test”|}
而且不会有任何警告

当然,您不能在任何语法产品中使用
,因为它是私有的


如果你有一种错觉,认为你应该能够制作电影

TOKEN : { DoubleColon : "::" }
TOKEN : { TestToken : "test" | <DoubleColon> }
标记:{DoubleColon::“}
令牌:{TestToken:“test”|}

希望:“:”有时是一个
,有时是一个
,那么你需要查阅和。

如果你想匹配重复字符,你需要添加括号并附加一个
+
量词:
标记:{}
是的,但这只给了我众所周知的EBNF选项“零或更多”(使用kleene star)或“一个或多个”(使用kleene plus)。我想要2个点,例如
。在你的例子中,它甚至会给我两个冒号的倍数,比这简单。您可以有
TOKEN:{}
TOKEN:{}
TOKEN : { DoubleSlash : "/"{2} }
TOKEN : { < Slash : "/" > }
TOKEN : { < TrippleSlash : <Slash><Slash><Slash> > }
If the label is preceded by a "#", then this regular expression may
not be referred to from expansion units, but only from within other regular
expressions. When the "#" is present, the regular expression is referred
to as a "private regular expression". 
TOKEN : { #DoubleColon : "::" }
TOKEN : { TestToken : "test" | <DoubleColon> }
TOKEN : { DoubleColon : "::" }
TOKEN : { TestToken : "test" | <DoubleColon> }