如何制作一个简单的谓词引擎

时间:2013-01-06 16:16:12

标签: c predicate scripting-language

我有一个任务,用户可以: 1.任何坐标形成任意数量的点; 2.根据标准删除点。

我意识到: 1.简单标准的情况(&gt;,&lt;,=,&gt; =等)。 2.复合标准的情况,它由两个标准组成,它们之间有OR (x> 5或y <3,x <= 2或y = 0)。我只是将一个查询所选择的内容添加到另一个查询所选择的内容中。然后我删除重复。这当然是不正确的,因为程序应该只选择一次需要的东西。好吧,但这对我来说或多或少是令人满意的。

我在C中编程,所以就我所知并且尽我所能,不可能使用自修改代码。

我决定将自己限制在两个标准之间,使用OR或AND。 我可以看到:&gt;,&lt;,&gt; =,&lt; =,=,!=。那是6例。然后x和y,点ID,距离原点的距离。 4例。然后,如果我使用组合,那将是我实施的太多案例。

但我无法想象除了为每个独特案例提供特殊条件之外的任何事情。 当然,我可以根据每个查询选择所有内容。然后使用AND的交集或OR的加法,就像我们在离散数学中那样做。但我喜欢这种方式:计算机应该只选择必要的东西。

因此,我提供的每个案例 if(x&gt; value&amp; y&lt; value) if(x&lt; value&amp; y = value) if(x = value&amp; y =&lt; value)

等。

但这似乎绝对是疯了。你能给我推荐什么吗?

1 个答案:

答案 0 :(得分:0)

这是关于解释自定义脚本代码。

如何在实践中工作很容易通过使用对象来解释,但没有它们则更难。没有对象,你将需要一个能够存储谓词的自定义结构,我将给你一个简单的例子,只是为了清除它:

union Expression {
  char type;
  int number;
};

int expressionValue(const Point &curPt, const Expression &exp) {
  if (type == TYPE_NUMBER) return exp.number;
  else if (type == TYPE_X) return curPt.x;
  else if (type == TYPE_Y) return curPT.y;
};

通过这种方式,你有一个联合,它能够为你的表达式存储一个任意类型的值,可能是一个原始数字或当前点的坐标。

struct Comparison {
  Expression exp1;
  Expression exp2;
  char type;
};

bool evaluateComparison(const Point &curPt, const Comparison &comp) {
  int v1 = expressionValue(pt, exp1);
  int v2 = expressionValue(pt, exp2);

  if (type == '=') return v1 == v2;
  else if (type == '<') return v1 < v2;
  // so on
}

现在你有一个能够存储单个比较的数据类型,你需要的是一种存储谓词的方法:

struct Predicate {
  char type;
  Comparison comp1;
  Comparison comp2;
};

bool evaluatePredicate(const  Point &curPt, const Predicate &pred) {
  if (pred.type == TYPE_OR) return evaluateComparison(curPt, comp1) || evaluateComparison(curPt, comp2);
  // oothers
};

当然,您可以计划您需要的任何类型的表达式或谓词(可能是n-ary AND或OR)。

你需要的最后一件事是一个简单的词法分析器和解析器,可以将你的输入变成一个谓词,然后你可以根据你的积分来评估你已完成。