ANTRL4 Praser。如何用语法编写特例?

时间:2017-03-17 15:52:22

标签: antlr4

我想解析以下示例:

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 ')';

显示预期的错误。

1 个答案:

答案 0 :(得分:1)

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

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