ANTLR如何在启动规则中使用2个备选项时获取特定错误消息

时间:2013-03-26 13:30:48

标签: antlr3

我正在尝试解析一个可以包含表创建脚本或索引创建脚本的文件 下面是语法。当我运行带有一些垃圾输入的脚本规则时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;};

1 个答案:

答案 0 :(得分:0)

我相信从ANTLR 3.5开始,错误消息 可能更具体。但是,没有完美的方法来报告所有类型错误的错误。我能给出的最好的提示是告诉你,ANTLR最擅长报告(和恢复)LL(1)决策中出现的错误,你可以通过具有更长前瞻要求的左因子规则来编写。

对于上面的示例,您可以将引用保留为create,如下所示。请注意,index_scripttable_script在左因素分析后都不会直接引用create

scripts : create_script;
create_script : create (index_script | table_script);

index_script : index index_name;
table_script : table table_name;