我想解析以下示例:
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 ')';
显示预期的错误。
答案 0 :(得分:1)
你的语法是不公正的(并且不完整,因为这里没有给出表达规则)。 param_list
有一个空的alt,与'(' ')'
部分相同。此外,param_list
中不需要左递归。相反,试试这个:
params: '(' param_list? ')';
param_list: type ID (',' type ID)*;