2014-09-05 57 views
1

我創建了一個示例語法和生成的Java源代碼並編譯它們並執行我的示例語法,但出現如下錯誤。ANTLR4:沒有可行的替代輸入錯誤

C:\devEnvironments\antlr>java org.antlr.v4.runtime.misc.TestRig mytest.RuleTest 
column_spec -tree 
aaa.bbb.ccc 
^Z 
line 1:0 no viable alternative at input 'aaa.bbb.ccc\r\n' 
(column_spec aaa.bbb.ccc\r\n) 

以下是我的規則源代碼。

grammar RuleTest; 

@header { 
package mytest; 
} 


column_spec: 
    ((schema_name DOT)? table_name DOT)? column_name ; 

ID: 
    ('A'..'Z' | 'a'..'z' | '_' | '$') ('A'..'Z' | 'a'..'z' | '_' | '$' | '0'..'9')* 
; 

// identifiers --- http://dev.mysql.com/doc/refman/5.6/en/identifiers.html -------------- 
schema_name   : ID; 
table_name   : ID; 
engine_name   : ID; 
column_name   : ID; 
view_name   : ID; 
parser_name   : ID; 
index_name   : ID; 
partition_name   : ID; 
partition_logical_name  : ID; 
constraint_symbol_name  : ID; 
foreign_key_symbol_name  : ID; 
collation_name   : ID; 
event_name   : ID; 
user_name   : ID; 
function_name   : ID; 
procedure_name   : ID; 
server_name   : ID; 
wrapper_name   : ID; 
alias    : (AS_SYM)? ANY_STRING; 

ANY_STRING: 
    ~(' ')+; 

DOT : '.' ; 
AS_SYM    : 'as'; 

WS : [ \t\r\n]+ -> skip ; 

我不知道爲什麼'\ r','\ n'字符沒有被跳過,爲什麼會發生這種錯誤? 我用antlr 4.4版本。

回答

1

ANY_STRING詞法分析器規則會匹配您的整個輸入。由於這個長度超過了ID規則匹配的3個字符,因此它將始終具有優先權。您需要刪除該規則,或者將其更改爲只匹配一個字符(因此永遠不會最長)。

ANY_STRING_CHAR : ~' '; 
+0

爲了增強Sams的答案:創建一個匹配一個或多個ANY_STRING_CHAR並在先前使用過ANY_STRING的地方使用它的規則'anyString'。 – Onur 2014-09-08 06:39:22

相關問題