ANTLR - 输入时没有可行的替代方案
ANTLR - No viable alternative at input
我收到错误: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 个词法分析器规则匹配,第一个定义的规则将 "win"。
由于输入 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';
...
我收到错误: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 个词法分析器规则匹配,第一个定义的规则将 "win"。
由于输入 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';
...