ANTLR - 检查字符串"#34; contruction"

时间:2018-05-04 09:22:48

标签: antlr antlr4

目前正在与ANTLR合作,发现一些有趣的事情并没有像我预期的那样发挥作用。

我尝试按照"测试10厘米"通过我的语法并且它失败了,然而"测试10 c m"像以前一样工作。 " cm"部分代码就是我所说的" wholeunit"在我的语法中,它如下:

wholeunit   :
              siunit
            | unitmod siunit
            | wholeunit NUM
            | wholeunit '/' wholeunit
            | wholeunit '.' wholeunit
            ;

它现在正在做的是" unitmod siunit"规则的一部分,其中unitmod = c和siunit = m。 我想知道的是我将如何制作它以便语法仍然遵循规则" unitmod siunit"在中间不需要空间的情况下,我可能会遗漏一些巨大的东西。 (是的,我有标记为跳过的空格和标签)

1 个答案:

答案 0 :(得分:2)

可能的原因是" cm"被认为是另一个令牌(可能是与#34;测试"相同的令牌类型),而不是" c"和" m"作为单独的代币。

请记住,在ANTLR词法分析器中,匹配最长输入的规则获胜。

一种解决方案可能是使wholeunit成为词法规则而不是解析器规则,并确保它高于匹配任何单词的规则(例如" test") - 如果相同的输入可以由多个规则匹配,ANTLR会按照它们的定义选择第一个规则。