【发布时间】: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 : { < DoubleColon : ("::")+ > } -
是的,但这只会给我众所周知的 EBNF 选项“零或更多”(带有 kleene 星)或“一个或多个”(带有 kleene plus)。我想拥有例如正好 2 个点,例如
..。在你的情况下,它甚至会给我两个冒号的倍数。
标签: java regex token lexer javacc