【问题标题】:How to make antlr find invalid input throw exception如何让antlr找到无效输入抛出异常
【发布时间】:2020-02-24 01:56:27
【问题描述】:

我的语法如下:

grammar Expr;


expr : '-' expr                                       # unaryOpExpr
     | expr ('*'|'/'|'%') expr                        # mulDivModuloExpr
     | expr ('+'|'-') expr                            # addSubExpr
     | '(' expr ')'                                   # nestedExpr
     | IDENTIFIER '(' fnArgs? ')'                     # functionExpr
     | IDENTIFIER                                     # identifierExpr
     | DOUBLE                                         # doubleExpr
     | LONG                                           # longExpr
     | STRING                                         # string
     ;


fnArgs : expr (',' expr)*                             # functionArgs
       ;

IDENTIFIER : [_$a-zA-Z][_$a-zA-Z0-9]* | '"' (ESC | ~ ["\\])* '"';
LONG : [0-9]+;
DOUBLE : [0-9]+ '.' [0-9]*;
WS : [ \t\r\n]+ -> skip ;

STRING: '"' (~["\\\r\n] | ESC)* '"';

fragment ESC : '\\' (['"\\/bfnrt] | UNICODE) ;
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX : [0-9a-fA-F] ;

MINUS : '-' ;
MUL : '*' ;
DIV : '/' ;
MODULO : '%' ;
PLUS : '+' ;

// math function
MAX: 'MAX';

当我输入以下文字时,它应该是有效的

-1.1

当我输入以下文本时出现错误:

-1.1ffff

我觉得应该报错,bug antlr 没有做,antlr 捕获之前的“-1.1”,丢弃“ffff”, 但我想改变这种行为,没有丢弃无效令牌,而是抛出异常,报告 检测无效令牌。

那我该怎么办,谢谢你的建议

【问题讨论】:

    标签: antlr antlr4 antlrworks antlr4cs


    【解决方案1】:

    您是否使用 expr 作为您的主要规则?如果是这样,请制定另一个规则,将其称为 parse 或 program 之类的名称,然后简单地编写如下:

    parse: expr EOF;
    

    这将使 antlr 不会忽略没有意义的尾随标记,实际上会抛出错误。

    【讨论】:

    • 非常感谢您的建议,这行得通
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多