我正在尝试解析一个可以包含表创建脚本或索引创建脚本的文件
下面是语法。当我运行带有一些垃圾输入的脚本规则时create xyz table
我收到错误line 1:0 no viable alternative at input 'create'
但是,当我运行table_script或index_script时,我得到特定的错误消息line 1:8 missing 'table' at 'xxxtab'
即使我将脚本作为缺少的表或索引运行,是否有可能获得相同的错误消息??
grammar DBScript;
options { output=AST; }
tokens {
CREATE;
TABLE;
INDEX;
}
scripts
:
index_script | table_script
;
index_script
: create index index_name;
table_script
: create table table_name ;
create
: 'create';
table
: 'table';
index
: 'index';
table_name
:
IDENT;
index_name
:
IDENT;
fragment LETTER : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT : '0'..'9';
INTEGER : DIGIT+ ;
IDENT : LETTER (LETTER | DIGIT)*;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;};
答案 0 :(得分:0)
我相信从ANTLR 3.5开始,错误消息 可能更具体。但是,没有完美的方法来报告所有类型错误的错误。我能给出的最好的提示是告诉你,ANTLR最擅长报告(和恢复)LL(1)决策中出现的错误,你可以通过具有更长前瞻要求的左因子规则来编写。
对于上面的示例,您可以将引用保留为create
,如下所示。请注意,index_script
和table_script
在左因素分析后都不会直接引用create
。
scripts : create_script;
create_script : create (index_script | table_script);
index_script : index index_name;
table_script : table table_name;