什么是最好的是评估的一种表达如下:
(A和B)或(C)或(未B和C)

(A&&B)||(A&&C)||(!B&&C)

在运行时,我计划在转换上的表情如下:
(True And False)或(True And False)或(不是虚假的和真正的)

(True&&False)||(True&&False)||(!假&&True)

条件:1)逻辑的表达是不知道直到运行时间。2)的数量变量及其价值是未知的,直到运行时间。3)变量值是从来没有空。

我知道我可以创建一个简单装配有一类和方法,我产生在运行的基础上的投入,但是有一个更好的办法。我已经这样做过。用一串的建设者写的代码,然后打电话给编译器。在那之后,你负荷的组件和电话的方法。

建议?

谢谢。

有帮助吗?

解决方案

如果你使用.NET3.5,那么你可以分析文本,并使用Expression类,创建一个抽象的树语法时才。然后,创建一个合适LambdaExpression实例,并将其编译成一个委托,然后可以执行。

构建解析器和语法树建设者这种相当简单的语法是相当有趣的运动,并会稍快执行比调用编译器(和它的整洁在我看来也一样)。

如果你不使用.NET3.5,那么它也没有复杂到自己实现一个解释抽象语法树。

其他提示

被警告:你说的是两个最终条件并不一定等同。所述&&运营商在C#将使用短路评价;而在VB逻辑And操作者没有。如果你想确保的声明是等价的,转换用户AndAndAlso和用户OrOrElse

对于简单的expresssions你可能不会注意到有什么差别。但是,如果条件可能有副作用,或者如果两者之间的性能差异是一个问题,这可能是重要的。

你可以很容易地做到这一点:

  1. 分析生成器(喜欢这些代码,上面提到的)就需要布尔的表情,因为输入和产生缀名单和
  2. 代码以评估反波兰式堆。

语法看起来是这样的:

program: exprList ;

exprList: expr { Append($1); }
    | expr OR exprList { Append(OR); }
    | expr AND exprList { Append(AND); }
    | NOT exprList { Append(NOT); }
    | ( exprList ) { /* Do nothing */ }
    ;

expr: var { Append($1); }
    | TRUE { Append(True); }
    | FALSE { Append(False); }
    ;

评估,你这样做:

for each item in list
    if item is symbol or truth value, push onto RPN stack
    else if item is AND, push (pop() AND pop())
    else if item is OR, push (pop() OR pop())
    else if item is NOT, push (NOT pop())

result = pop()

对符号,你要替代品的真实价值在运行时间。

可以使用 https://github.com/mrazekv/logicalparser

其简单地库来编写逻辑表达式(evaulated与precenednce表,允许OR,NOT AND运算符和>,> =,<=,<关于整数变量和=上字符串变量)

可以编写一个简单的解释器/语法分析器。使用类似 ANTLR 和重用现有的语法。

如果您使用.NET 3.5,则可以创建一个Lambda表达式。然后,你可以从它创建一个委托,并调用标准委托/方法。 互联网上的是一个许多关于Lambda表达式样品。

一个解决办法是组装表达式作为一个字符串,然后把它的SQL Server,或者无论你的数据库是进行评估。用1 = 1或0 = 1分别为真和假替换实际变量,也最终会与这样的查询:

选择1 WHERE(1 = 1,0 = 1)或(1 = 1,1 = 1)或(不是0 = 1,1 = 1)

然后,当您运行查询,你会得到一个1点回来时,结果为真。也许不是最完美的解决方案,但它会奏效。很多人可能会反对这项建议,但我只是去那里扔出去的可能的解决方案呢。

这将不会是最好的答案,但我自己前一段时间有这个问题。

下面是我的旧代码: VB.Net - !不保证在所有

https://cloud.downfight.de/index.php/s/w92i9Qq1Ia216XB

Dim BoolTermParseObjekt As New BoolTermParse
MsgBox(BoolTermParseObjekt.parseTerm("1 und (((0 oder 1 und (0 oder 4))) oder 2)").ToString)

此代码吃具有多个字符串“(”,“)”,“和”,“或”加号“其他东西”并通过用布尔值替换事打破了逻辑到布尔值。 因此:

无论什么其他的事情“我想评价我不得不把在功能resolveTerm() 在评论 “”funktionenausführenUNDzurückgeben,einzelwert!“ 第2页。 有唯一的评价RightNow的是“如果数量是> 1”

问候

看看我的图书馆,。这是使用调度场算法评估布尔表达式.NET标准库。

它也可以生成一个真值表为你的表情。

您也可以实现自己的语法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top