ANTLR4:在输入错误时没有可行的替代方案

时间:2014-09-05 07:27:00

标签: antlr antlr4

我创建了一个示例语法并生成了java源代码并编译它们并执行了我的示例语法,但是我收到了如下错误。

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 个答案:

答案 0 :(得分:1)

ANY_STRING词法分析器规则匹配您的整个输入。由于它长于ID规则匹配的3个字符,因此它始终具有优先权。您需要删除该规则,或更改它以使其仅匹配一个字符(因此永远不会是最长的)。

ANY_STRING_CHAR : ~' ';