ANTLR - 检查字符串的 "contruction"
ANTLR - Checking for a String's "contruction"
目前正在使用 ANTLR 并发现一些有趣的东西没有按我的预期工作。
我尝试通过我的语法 运行 按照 "test 10 cm" 的方式进行操作,但它失败了,但是 "test 10 c m" 可以正常工作。代码的 "cm" 部分是我在语法中称为 "wholeunit" 的部分,如下所示:
wholeunit :
siunit
| unitmod siunit
| wholeunit NUM
| wholeunit '/' wholeunit
| wholeunit '.' wholeunit
;
它现在正在做的是规则的 "unitmod siunit" 部分,其中 unitmod = c 和 siunit = m 。
我想知道的是我将如何做到这一点语法仍然遵循规则 "unitmod siunit" 而无需在中间使用 space,我可能会遗漏一些巨大的东西。 (是的,我有 space 标记为跳过)
可能的原因是 "cm" 被认为是另一个令牌(可能与 "test" 的令牌类型相同),而不是 "c" 和 "m" 作为单独的令牌。
记住,在 ANTLR 词法分析器中,匹配最长输入的规则获胜。
一个解决方案可能是使 wholeunit
成为词法分析器规则而不是解析器规则,并确保它高于匹配任何单词的规则(如 "test")- 如果相同的输入可以被多个规则匹配,ANTLR 选择第一个规则,按照它们在其中定义的顺序。
目前正在使用 ANTLR 并发现一些有趣的东西没有按我的预期工作。
我尝试通过我的语法 运行 按照 "test 10 cm" 的方式进行操作,但它失败了,但是 "test 10 c m" 可以正常工作。代码的 "cm" 部分是我在语法中称为 "wholeunit" 的部分,如下所示:
wholeunit :
siunit
| unitmod siunit
| wholeunit NUM
| wholeunit '/' wholeunit
| wholeunit '.' wholeunit
;
它现在正在做的是规则的 "unitmod siunit" 部分,其中 unitmod = c 和 siunit = m 。 我想知道的是我将如何做到这一点语法仍然遵循规则 "unitmod siunit" 而无需在中间使用 space,我可能会遗漏一些巨大的东西。 (是的,我有 space 标记为跳过)
可能的原因是 "cm" 被认为是另一个令牌(可能与 "test" 的令牌类型相同),而不是 "c" 和 "m" 作为单独的令牌。
记住,在 ANTLR 词法分析器中,匹配最长输入的规则获胜。
一个解决方案可能是使 wholeunit
成为词法分析器规则而不是解析器规则,并确保它高于匹配任何单词的规则(如 "test")- 如果相同的输入可以被多个规则匹配,ANTLR 选择第一个规则,按照它们在其中定义的顺序。