【问题标题】:JavaCC: Multiple equal characters in token definitionJavaCC:令牌定义中的多个相等字符
【发布时间】:2014-06-15 21:00:08
【问题描述】:

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

没有任何成功。效果是一样的。

【问题讨论】:

  • 如果要匹配重复字符,需要加括号并追加+量词:TOKEN : { &lt; DoubleColon : ("::")+ &gt; }
  • 是的,但这只会给我众所周知的 EBNF 选项“零或更多”(带有 kleene 星)或“一个或多个”(带有 kleene plus)。我想拥有例如正好 2 个点,例如 ..。在你的情况下,它甚至会给我两个冒号的倍数。

标签: java regex token lexer javacc


【解决方案1】:

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

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

例如

TOKEN : { < Slash : "/" > }

为了然后执行以下操作:

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

我已经对其进行了编码和测试,它似乎工作正常。

【讨论】:

  • 比这更简单。您可以拥有TOKEN:{ &lt;TRIPPLESLASH : "///" &gt; }TOKEN:{ &lt;HEPTADECASLASH: ("/"){17} &gt; }
【解决方案2】:

你需要的是“私有正则表达式”。见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> }

并且不会有任何警告。

当然你不能在任何语法产生式中使用&lt;DoubleColon&gt;,因为它是私有的。


如果您幻想自己应该能够制作作品

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

希望“::”有时是&lt;DoubleColon&gt;,有时是&lt;TestToken&gt;,那么您需要咨询FAQ 3.3FAQ 3.6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多