【问题标题】:ANTLR v3 grammar for boolean/conditional expression用于布尔/条件表达式的 ANTLR v3 语法
【发布时间】:2013-08-15 20:43:57
【问题描述】:

我正在尝试为以下表达式创建语法:

(foo = bar or (bar = "bar" and baz = 45.43)) and test = true

到目前为止我的语法是这样的:

grammar filter;

tokens {
    TRUE = 'true';
    FALSE = 'false';
    AND = 'and';
    OR = 'or';
    LT = '<';
    GT = '>';
    EQ = '=';
    NEQ = '!=';
    PATHSEP = '/';
    LBRACK = '[';
    RBRACK = ']';
    LPAREN = '(';
    RPAREN = ')';
}

expression : or_expression EOF;

or_expression : and_expression (OR or_expression)*;

and_expression : term (AND term)*;

term : atom ( operator atom)? | LPAREN expression RPAREN;

atom : ID | INT | FLOAT | STRING | TRUE | FALSE;

operator : LT | GT | EQ | NEQ;

INT : '0'..'9'+;
FLOAT : ('0'..'9')+ '.' ('0'..'9')*;
STRING : '"' ('a'..'z'|'A'..'Z'|'_'|' ')* '"';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

但在 ANTLRWorks 1.4.3 中,我得到了解析树:

但是对于我的生活,我无法弄清楚我的语法有什么问题。这里缺少什么令牌?

非常感谢。

编辑:为了澄清atom 生产中的atom ( operator atom)? 替代方案,我或许应该提到原子应该能够独立存在而不与另一个原子进行比较。例如。 a or b 是一个有效的表达式。

【问题讨论】:

    标签: grammar antlr3


    【解决方案1】:

    我在这里回答我自己的问题。我发现我的语法有两个问题。第一个很容易被发现;我已将EOF 放在我的顶级规则的末尾:

    expression : or_expression EOF;
    

    EOF 因此是丢失的令牌。我的解决方案是从expression 规则中删除EOF,并在其上方引入一条规则:

    filter: expression EOF;
    

    第二个问题是我的or_expression 规则应该是:

    or_expression : and_expression (OR and_expression)*;
    

    而不是

    or_expression : and_expression (OR or_expression)*;
    

    完整的更正语法是:

    grammar filter;
    
    tokens {
        TRUE = 'true';
        FALSE = 'false';
        AND = 'and';
        OR = 'or';
        LT = '<';
        GT = '>';
        EQ = '=';
        NEQ = '!=';
        PATHSEP = '/';
        LBRACK = '[';
        RBRACK = ']';
        LPAREN = '(';
        RPAREN = ')';
    }
    
    filter: expression EOF;
    
    expression : or_expression;
    
    or_expression : and_expression (OR and_expression)*;
    
    and_expression : term (AND term)*;
    
    term : atom (operator atom)? | LPAREN expression RPAREN;
    
    atom : ID | INT | FLOAT | STRING | TRUE | FALSE;
    
    operator : LT | GT | EQ | NEQ;
    
    INT : '0'..'9'+;
    FLOAT : ('0'..'9')+ '.' ('0'..'9')*;
    STRING : '"' ('a'..'z'|'A'..'Z'|'_'|' ')* '"';
    ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
    

    得到的解析树是:

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多