2015-06-08 46 views
0

我收到錯誤:no viable alternative at input 'mult'當我試圖解析輸入:div(mean(mult(field_a, field_b)), sum(field_b))ANTLR - 輸入時沒有可行的替代方法

這裏是我的語法:

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

只要一個或多個字符可以通過超過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'; 
... 
相關問題