ANTLR - 在输入时没有可行的替代方案

时间:2015-06-08 18:08:20

标签: antlr antlr4

我在尝试解析输入时收到错误no viable alternative at input 'mult'div(mean(mult(field_a, field_b)), sum(field_b))

这是我的语法:

grammar Analytics;

start: expr | stat;

expr
    : UNARY_EXPR '(' (stat | expr | NUMBER ) ')'                                        #unaryExpr
    | BINARY_EXPR '(' (stat | expr | constant) ',' (stat | expr | constant) ')'         #binaryExpr
    | MULTIPLE_EXPR '(' (stat | expr | constant) ',' (stat | expr | constant)+ ')'      #multipleExpr
    ;       

stat
    : UNARY_STAT  '(' (operation | field) ')'                                           #unaryStat
    | BINARY_STAT '(' (operation | field) ',' (operation | field) ')'                   #binaryStat
    ;

operation
    : UNARY_OPERATION '(' operation ')'                                                 #unaryOperation
    | BINARY_OPERATION '(' operation ',' operation ')'                                  #binaryOperation
    | MULTIPLE_OPERATION '(' operation ',' operation+ ')'                               #multipleOperation
    | field                                                                             #fieldOperation
    ;

constant: NUMBER;

field: IDENTIFIER;

UNARY_EXPR: 'neg' | 'const_num' | 'rev' | 'miss' | 'const_date' | 'const_str';
BINARY_EXPR: 'div' | 'pow' | 'log'; 
MULTIPLE_EXPR: 'add' | 'mult' | 'date_math' | 'concat'; 

UNARY_STAT: 'count' | 'missing' | 'min' | 'max' | 'stddev' | 'sum' | 'sumofsquares' | 'mean' | 'unique' | 'median' |
    'const_num' | 'neg' | 'abs';
BINARY_STAT: 'add' | 'mult' | 'div' | 'pow' | 'log';

UNARY_OPERATION: 'neg' | 'rev' | 'const_date' | 'const_str';
BINARY_OPERATION: 'div' | 'pow' | 'log' | 'miss'; 
MULTIPLE_OPERATION: 'add' | 'mult' | 'date_math' | 'concat'; 

OPEN_BRACKET: '(';
CLOSE_BRACKET: ')';
COMMA: ',';

NUMBER: ('0'..'9')+ ('.' ('0'..'9')+)? ;
IDENTIFIER : [a-zA-Z][a-zA-Z0-9_]*;

WS : (' ' | '\t')+ -> skip;

我在这里做错了什么导致它与mult不匹配? 是否有我可以用来调试此错误的建议方法?

另外,我如何检查每条规则匹配哪些替代方案? 例如,我得到的toStringTree()输出是:(start (expr div ( (stat mean ( mult ( field) , field ) ) , sum ( field ) )))。我如何判断第一个expr规则是否与BINARY_EXPR '(' (stat | expr | constant) ',' (stat | expr | constant) ')'而不是UNARY_EXPR '(' (stat | expr | NUMBER ) ')'匹配?

1 个答案:

答案 0 :(得分:1)

每当一个或多个字符可以匹配超过1个词法分析器规则时,首先定义的规则将“获胜”。

由于输入mult可以与这些规则匹配:

MULTIPLE_EXPR: 'add' | 'mult' | 'date_math' | 'concat'; 
BINARY_STAT: 'add' | 'mult' | 'div' | 'pow' | 'log';
MULTIPLE_OPERATION: 'add' | 'mult' | 'date_math' | 'concat'; 

第一条规则MULTIPLE_EXPR将始终为输入mult选择。

你必须做这样的事情:

multiple_expr      : ADD | MULT | ... ; 
binary_stat        : ADD | MULT | ... ;
multiple_operation : ADD | MULT | ... ; 

ADD  : 'add';
MULT : 'mult';
...