我创建了一个示例语法并生成了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版本。
答案 0 :(得分:1)
ANY_STRING
词法分析器规则匹配您的整个输入。由于它长于ID
规则匹配的3个字符,因此它始终具有优先权。您需要删除该规则,或更改它以使其仅匹配一个字符(因此永远不会是最长的)。
ANY_STRING_CHAR : ~' ';