我正在努力学习antlr。如果我期待这些句子(第一个单词是大写,其余可以是多个字母数字混合大小写单词):
HELLO world foo
THIS ThaT FOO
HELLO THAT
BANANA BeRRY 99
APPLE juice80
如果我将规则定义为:
grammar Hello;
r: UC MC
UC: [A-Z]+ ; //only uppercase
MC: [A-Z|a-z|0-9]+ ; //uppercase, lowercase, and numbers or anycombination of these
对于输入HELLO WORLD,我收到错误:
mismatched input WORLD expecting MC
我看到这两个规则在大写字符方面存在冲突。我该如何处理这类案件?
答案 0 :(得分:1)
这种语法最简单的方法是创建一个允许两种令牌类型的解析器规则:
grammar Hello;
r: uc mc;
uc: UC;
mc: UC | MC;
UC: [A-Z]+ ; //only uppercase
MC: [A-Za-z0-9]+ ; //uppercase, lowercase, and numbers or anycombination of these
如果你想要令牌正确,你必须影响词法分析器以切换lexing模式。