【发布时间】:2021-01-20 19:41:38
【问题描述】:
在我们的软件中,我们可以一起单击查询来选择元素的子集。在内存中,完成的查询是表示过滤条件的列表和对象 (CLO) 的构造。现在我要实现一种查询语言,通过用 ANTLR 解析它来创建相同的东西。
该语言必须只涵盖简单的表达式及其逻辑连接“AND”和“OR”。
name LIKE 'foo'
name LIKE 'bar' AND size > 42 OR comment LIKE 'ignore'
“名称”、“大小”和“评论”这些词是属性。由“AND”连接的每个属性都将是列表中的对象 A。每个与“或”连接的属性都将是一个对象 B 并进入 A 的列表。
我的语法(摘录):
expr
: expr AND expr # andExpr
| expr OR expr # orExpr
| IDENTIFIER numOp INT # numExpr
| IDENTIFIER strOp STR # strExpr
;
numOp : (GT | LT | EQ);
strOp : (EQ | LIKE);
使用带有 ANTLR 的访问者模式,我重写了 numExpr 和 strExpr 的方法并返回 A 对象。但我还需要将这些对象与逻辑运算符“AND”|“OR”相关联。 当我重写 logicExpr 方法并调用 visit() 方法时,首先计算两个逻辑运算符,然后按顺序计算基本表达式。这感觉有点尴尬,因为表达式与逻辑运算符相当分离。
OR
AND
name
size
comment
问:如何根据前面的逻辑运算符处理相应的表达式?什么是好的方法?
问:此外,逻辑表达式语句在语法规则'expr'中的正确位置还是应该先出现基本表达式?
【问题讨论】:
-
如果您引用 AND/OR,则 AND 优先。