2014-09-05 39 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

相关问题