目前正在与ANTLR合作,发现了一些有趣的东西,但并没有按照我的预期工作。
我尝试在我的语法中按照"测试 10 厘米"的思路运行一些东西,但它失败了,但是"测试 10 c m"可以像以前一样工作。代码的"cm"部分在我的语法中是我所说的"整体单位",如下所示:
wholeunit :
siunit
| unitmod siunit
| wholeunit NUM
| wholeunit '/' wholeunit
| wholeunit '.' wholeunit
;
它现在正在做的是规则的"unitmod siunit"部分,其中unitmod = c和siunit = m 。 我想知道的是,我将如何使语法仍然遵循"unitmod siunit"规则,而不需要中间的空格,我可能会错过一些巨大的东西。(是的,我有标记为要跳过的空格和制表符(
可能的原因是"cm"一起被视为另一个标记(可能与"test"相同的令牌类型(,而不是"c"和"m"作为单独的标记。
请记住,在 ANTLR 词法分析器中,与最长输入匹配的规则获胜。
一种解决方案可能是使wholeunit
成为词法分析器规则而不是解析器规则,并确保它高于与任何单词匹配的规则(如"test"(——如果相同的输入可以由多个规则匹配,ANTLR 会选择第一个规则按定义顺序。