grammar - bool /条件表达式的 ANTLR v3 语法

标签 grammar antlr3

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

(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 中,我得到了解析树:

The resulting parse tree with the above input

但是我一生都无法弄清楚我的语法出了什么问题。这里缺少什么标记?

提前非常感谢。

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

最佳答案

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

expression : or_expression EOF;

因此,EOF 是丢失的标记。我的解决方案是从 表达式 规则中删除 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'|'_')*;

生成的解析树是:

The correct parse tree

关于grammar - bool /条件表达式的 ANTLR v3 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18261484/

相关文章:

algorithm - 转移和向前看之间的区别

antlr3 - 使用 Antlr-3.5-complete.jar 生成 OracleSQL 语法时出现大量模板错误

java - 我可以从生成的代码中删除 ANTLR 依赖项吗?

java - Antlr 3.4.0 生成的解析器的输入不匹配,而不是在解释器中

c++ - 在 ANTLR 生成的 C 解析器中使用 C++ 类型

antlr - 如何使用 ANTLRWorks 创建/指定用于测试树语法的 AST 输入?

parsing - Xtext语法错误 "Decision can match input ... using multiple alternatives: 1, 3, 4, 5"

antlr 左递归嵌套 bool 表达式

parsing - 如何改进语法错误报告?

java - Antlr 规则的返回值必须是 *Context 类型吗?