Antlr中的约束冲突

时间:2015-05-08 01:21:36

标签: antlr4

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

我看到这两个规则在大写字符方面存在冲突。我该如何处理这类案件?

1 个答案:

答案 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模式。