[在第三行输入以下输入时出现错误:
SELECT entity_one, entity_two FROM myTable;
first_table, extra_table as estable, tineda as cam;
asteroid tenga, tenta as myName, new_eNoal as coble
我使用antlrWorks对其进行了调试,发现与第三行相对应的错误消息显示在调试器输出窗口中:
output / __ Test ___ input.txt第3:8行必填(...)+循环与输入''上的内容不匹配output / __ Test ___ input.txt第3:9行在“ tenga”处缺少END_COMMAND]
但是当我自己运行应用程序时,这些错误消息不会在控制台上显示。
错误消息出现在控制台的第一行,如:
asteroid tenga, tenta as myName, new_eNoal as coble
SELECT entity_one, entity_two FROM myTable;
first_table, extra_table as estable, tineda as cam;
控制台输出:
inputSql.rst第1:8行必需(...)+循环与输入''上的内容不匹配inputsql.rst第1:9行在“ tenga”处缺少END_COMMAND]
当错误不在第一行时,如何在控制台上显示它们?
UserRequest.g
grammar UserRequest;
tokens{
COMMA = ',' ;
WS = ' ' ;
END_COMMAND = ';' ;
}
@header {
package com.linktechnology.input;
}
@lexer::header {
package com.linktechnology.input;
}
@members{
public static void main(String[] args) throws Exception {
UserRequestLexer lex = new UserRequestLexer(new ANTLRFileStream(args[0]));
CommonTokenStream tokens = new CommonTokenStream(lex);
UserRequestParser parser = new UserRequestParser(tokens);
try {
parser.request();
} catch (RecognitionException e) {
e.printStackTrace();
}
}
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
process : request* EOF ;
request : (sqlsentence | create) END_COMMAND ;
sqlsentence : SELECT fields tableName ;
fields : tableName (COMMA tableName)* FROM ;
create : tableName (COMMA tableName)+ ;
tableName : WS* NAME (ALIAS NAME)? ;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
NAME : LETTER ( LETTER |DIGIT | '-' | '_' )* ;
fragment LETTER: LOWER | UPPER;
fragment LOWER: 'a'..'z';
fragment UPPER: 'A'..'Z';
fragment DIGIT: '0'..'9';
SELECT : ('SELECT ' |'select ' ) ;
FROM : (' FROM '|' from ') ;
ALIAS : ( ' AS ' |' as ' ) ;
WHITESPACE : ( '\r' | '\n' | '\t' | WS | '\u000C' )+ { $channel = HIDDEN; } ;
这是因为在main
方法中,您在调试时调用parser.request()
,因此选择process
规则作为起点。而且由于request
从您的输入中消耗了一个(sqlsentence | create) END_COMMAND
,所以不会产生错误。
将main
方法更改为:
@members{
public static void main(String[] args) throws Exception {
UserRequestLexer lex = new UserRequestLexer(new ANTLRFileStream(args[0]));
CommonTokenStream tokens = new CommonTokenStream(lex);
UserRequestParser parser = new UserRequestParser(tokens);
try {
parser.process();
} catch (RecognitionException e) {
e.printStackTrace();
}
}
}
并且您会在控制台上看到相同的错误,因为process
强制解析器使用整个输入,一直到EOF
。