【问题标题】:Antlr4 Parse NumberAntlr4 解析数
【发布时间】:2021-11-09 09:39:41
【问题描述】:

我想写像springEl这样的表达式来练习。

当我输入#user.age>3时是对的。

但我输入#user.age>3ww#user.age>3ww && #user.age<2 解析器没有提示任何错误。我不认为#user.age>3ww 是正确的语法。

如何改变语法让解析器提示3ww是错误的?

我的部分 antlr4 语法

grammar FlowExpr;

statement : expr;

expr
    :   expr (Mul|Div) expr
    |   expr (Add|Sub) expr
    |   expr BooleanOperator expr
    |   expr And expr
    |   expr Or expr
    |   Not expr
    |   object
    ;

object
    :   boolean
    |   invoker
    |   entity
    |   number
    |   String
    ;
entity : ObjectSymbol Identifier;
boolean : 'true'|'false';
invoker : entity attribute+;
attribute : Dot Identifier;
number
    :   Integer
    |   Float
    ;
Identifier :  Letter (Letter|JavaIDDigit)* ;
Integer : '-'? INT ;
Float : '-'? INT Dot [0-9]*;

Commas : ',';

BooleanOperator
    :   '>'|'>='|'<'|'<='|'=='|'!=';
Not:'!';
Dot : '.';
ObjectSymbol : '#';
WS  :   [ \t\n\r]+ -> skip ;

enter image description here

【问题讨论】:

    标签: java antlr


    【解决方案1】:

    输入2w 被标记为Integer- 和Identifier 标记。然后number 解析器规则使用Integer 令牌,然后停止解析(它完全匹配1 个Integer 令牌,这是你告诉它要做的)。

    如果您想强制解析器使用 所有 词法分析器生成的标记,您需要通过添加 EOF(文件/输入标记的内置结尾)。您通常有 1 个包含此 EOF 的条目规则:

    grammar t;
    
    entryPoint
        : number EOF
        ;
    
    number
        :   Integer
        |   Float
        ;
    fragment INT :  '0'| [1-9][0-9]* ; 
    Integer : '-'? INT ;
    Float : '-'? INT Dot [0-9]*;
    Dot : '.';
    Identifier :  [a-zA-Z];
    

    【讨论】:

    • 我将问题编辑得更清楚。请再看看帮助我。谢谢
    • 我试试把statement : expr;改成statement : expr EOF;有用
    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2021-01-04
    • 2023-03-20
    相关资源
    最近更新 更多