我正在尝试匹配一些开头相同但结尾不同的内容例如:
' + '东西+
'+' | '-' | '/' | '*' something something something somethingDifferentAtTheEnd
,下面的代码是:
something: // rule for something here
rule1: '+' something+
rule2: OPERATOR something something somethingDifferentAtTheEnd
ruleForSomethingDifferent: // goes here
OPERATOR: '+' | '-' | '/' | '*'
问题是我不能让这个工作,我似乎总是得到'多余的输入'错误,当我通过以'+'开始的rule2(它试图匹配第一个失败,因为有一个'somethingDifferentAtTheEnd',但它不属于第二条规则。
词法分析器将在'+'字符到达解析器之前消耗所有的'+'字符,因此rule1
将使Antlr感到困惑-在生成解析器/词法分析器时可能会出现错误或警告,并且可能导致运行时错误消息似乎没有多大意义。应在继续之前纠正所有生成错误和警告。
在匹配规则中,总是首先选择匹配令牌序列最长的规则。
这可能是你想要的:
rule1 : Plus a+ ;
rule2 : operator a a b ;
a : .... ;
b : .... ;
operator : Plus | Minus | Div | Star ;
Plus : '+' ;
Minus: '-' ;
Div : '/' ;
Star : '*' ;