ANTLR4 解析器。文法中的特例怎么写?

ANTRL4 Praser. How to write the special case in grammar?

我要解析下面的例子:

class A {
    private int main(i<a) {
    }
}

我希望产生以下错误:"line 2:21 mismatched input 'i' expecting ')'"

但是,它出现了 line 2:21 no viable alternative at input '(i'

这是我的语法:

//Identifiers
ID : [a-z] ( LETTER | DIGIT0 | '_' )*;
fragment LETTER : [a-zA-Z];

type : PRIMITIVE_TYPE
     | CLASS_TYPE;

params : '(' ')' | '(' param_list ')';

param_list : /* epsilon */
           | type ID
           | param_list ',' type ID;

如果我这样修改语法:

params : '(' ')' | '(' param_list ')';

显示了预期的错误。

你的语法有歧义(而且不完整,因为这里没有给出表达式规则)。 param_list 有一个空的 alt,与 '(' ')' 部分相同。此外,param_list 中不需要左递归。试试这个:

params: '(' param_list? ')';
param_list: type ID (',' type ID)*;