如何定义由重复字符组成的标记,如下例所示:
“...”
什么对应
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} }
没有任何成功。它具有相同的效果。
答案 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.3和FAQ 3.6。