代码之家  ›  专栏  ›  技术社区  ›  sveri

antlr4等于/赋值歧义

  •  0
  • sveri  · 技术社区  · 5 年前

    我有以下语法:

    bRules: bRule ( NL bRule )*;
    bRule: IF WS lhs WS THEN WS rhs;
    
    lhs: condition (WS AND WS condition)*;    
    rhs: result (WS AND WS result)*;    
    
    condition: parameter WS operator WS value ; 
    result: parameter WS EQ WS value ; 
    
    parameter: STRING;
    value: STRING;
    
    IF: 'if';
    THEN: 'then';
    AND: '&';
    NL : [\n\r]*;
    WS: [ ]*;
    
    
    operator: GT|LT|GE|LE|EQ;
    
    GT: '>';
    LT: '<';
    GE: '>=';
    LE: '<=';
    EQ: '=';
    
    STRING: [0-9a-zA-Z]+;
    

    我的目标是制定如下规则:

    IF age < 2 THEN status = baby
    ...
    

    它主要起作用,但不起作用的是,我可以在条件端使用equals运算符“=”,如下所示:

    IF age = 2 THEN status = baby
    

    然后我得到一条错误消息,表示不支持operatortype。

    我试了一些不同的方法,但没能成功。对如何改进我的语法有什么想法或建议吗?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Bart Kiers    5 年前

    注意,你说你的输入是 IF ... ,但你的lexer只处理小写 if . 有两个lexer规则匹配零个字符,这是错误的。

    更改:

    NL : [\n\r]*;
    WS: [ ]*;
    

    进入:

    NL : [\n\r]+;
    WS: [ ]+;
    

    除此之外,我无法复制你所描述的。当我分析 if age = 2 then status = baby 使用您发布的语法,我得到以下解析树:

    enter image description here

    另外,简单地说 skip 空格而不是把它们散落在解析器规则上?而是像这样:

    bRules: bRule (NL bRule )* EOF;
    bRule: IF lhs THEN rhs;
    
    lhs: condition (AND condition)*;
    rhs: result (AND result)*;
    
    condition: parameter operator value ;
    result: parameter EQ value ;
    
    ...
    
    WS: [ \t]+ -> skip;