antlr,如何修复语法so(varname)?如果存在但错误,则解析失败

antlr,如何修复语法so(varname)?如果存在但错误,则解析失败,antlr,Antlr,我正在重写这篇文章(虽然问题相同,但字数更少) 我重写了我的语法,只是为了达到这个最高水平 statement: SELECT EOF!; #removed all other rules and tokens and still not working SELECT : ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t'); 然后我有以下java代码(在我的解析器上没有像我在其他人的帖子上看到的那样的解析方法:(:()) 我应该在

我正在重写这篇文章(虽然问题相同,但字数更少)

我重写了我的语法,只是为了达到这个最高水平

statement: SELECT EOF!;
#removed all other rules and tokens and still not working
SELECT  :   ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t');
然后我有以下java代码(在我的解析器上没有像我在其他人的帖子上看到的那样的解析方法:(:())

我应该在解析时遇到一个异常,但我没有:(:)这是一个带有EOF的非常简单的语法,但它就是不起作用。你知道为什么吗?我调用了错误的解析语句吗

注意:我试图通过将问题简化为这个似乎不起作用的简单问题来简化一个更大的问题

完整(非常小)的语法文件在这里

grammar NoSql;


options { 
    output = AST; 
    language = Java;
}

tokens {


}

@header {
package com.alvazan.orm.parser.antlr;
}

@lexer::header {
package com.alvazan.orm.parser.antlr;
}


@rulecatch {
    catch (RecognitionException e)
    {
        throw e;
    }
}

statement: SELECT EOF!;

SELECT  :   ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t');

WS  :
    (   ' '
        |   '\t'
        |   '\r'
        |   '\n'
        )+
        { $channel=HIDDEN; }
        ;  

ESC :
    '\\' ('"'|'\''|'\\')
    ;
谢谢, 院长

我应该在解析时得到一个异常,但我没有:(:)这是一个带有EOF的非常简单的语法,但它就是不起作用

如果您没有“告诉”ANTLR引发异常,则ANTLR可能不会在输入无效的情况下引发异常/错误。在许多情况下,ANTLR会尝试从不匹配/无效的输入中恢复,并尝试继续解析。在您的情况下,您会看到在
stderr
上写入输出,但您可能不会得到异常


如果您确实希望在您的案例中出现异常,请参阅:

有趣的是,我认为rulecatch就是用于此目的的,但我想这一定是生成代码的另一部分。谢谢!!!
grammar NoSql;


options { 
    output = AST; 
    language = Java;
}

tokens {


}

@header {
package com.alvazan.orm.parser.antlr;
}

@lexer::header {
package com.alvazan.orm.parser.antlr;
}


@rulecatch {
    catch (RecognitionException e)
    {
        throw e;
    }
}

statement: SELECT EOF!;

SELECT  :   ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t');

WS  :
    (   ' '
        |   '\t'
        |   '\r'
        |   '\n'
        )+
        { $channel=HIDDEN; }
        ;  

ESC :
    '\\' ('"'|'\''|'\\')
    ;