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

时间:2014-06-15 21:00:08

标签: java regex token lexer javacc

在JavaCC中

如何定义由重复字符组成的标记,如下例所示:

  

“...”
  什么对应

TOKEN : { TripleDot : "..." }

  

“::”   什么对应

TOKEN : { DoubleColon : "::" }

  

“//”   什么对应

TOKEN : { DoubleSlash : "//" }

JavaCC编译器允许我在没有警告消息的情况下定义这些令牌,但是我很快就在另一个词法令牌规则中使用这些令牌,其中这个定义是一种替代方案,我收到警告。见下文:

在我写

时给出上述规则
TOKEN : { TestToken : <DoubleColon> }

我没有得到任何警告。但是当我写作

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

JavaCC编译器告诉我以下内容:

  

Waning:第84行:第9列:正则表达式选择:TestToken可以   永远不会匹配为:DoubleColon。

但为什么会这样呢?我理解Lexer可能很难识别出重复的字符但是我应该能够定义一个LOOKAHEAD,即使在令牌定义中也是如此。

我想念什么?

附录:

我事件尝试了这个:

TOKEN : { DoubleSlash : "/"{2} }

没有任何成功。它具有相同的效果。

2 个答案:

答案 0 :(得分:1)

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

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

e.g。

TOKEN : { < Slash : "/" > }

然后执行以下操作:

TOKEN : { < TrippleSlash : <Slash><Slash><Slash> > }

我已经编码并测试了它,似乎工作正常。

答案 1 :(得分:0)

你需要&#34;私人正则表达式&#34;。见The JavaCC documentation

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> }

并且没有警告。

当然,您不能在任何语法制作中使用<DoubleColon>,因为它是私密的。


如果您认为自己应该能够制作作品

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

希望&#34; ::&#34;有时候是<DoubleColon>,有时是<TestToken>,那么您需要咨询FAQ 3.3FAQ 3.6