Antlr 中的冲突约束

Conflicting constraints in Antlr

我正在努力学习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

我发现这两个规则在涉及大写字符时会发生冲突。我该如何处理这种情况?

此语法最简单的方法是创建一个允许两种标记类型的解析器规则:

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

如果你想要正确地对标记进行词法分析,你将不得不影响词法分析器来切换词法分析模式。