【问题标题】:ANTLR antlrWorks error messages are not displayed to the output consoleANTLR antlrWorks 错误消息未显示到输出控制台
【发布时间】:2011-08-19 00:56:10
【问题描述】:

当在第三行输入以下错误时:

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 line 1:8 required (...)+ 循环在输入“”中不匹配任何内容 inputSql.rst line 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; } ;

【问题讨论】:

    标签: antlr antlrworks


    【解决方案1】:

    那是因为在您的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

    【讨论】:

    • 现在运行流畅。谢谢,巴特!
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多