逻辑条件的 C++ 中缀到前缀转换

Posted

技术标签:

【中文标题】逻辑条件的 C++ 中缀到前缀转换【英文标题】:C++ infix to prefix conversion for logical conditions 【发布时间】:2010-04-01 04:41:53 【问题描述】:

我想在 C++ 中计算一个表达式。为了评估它,我希望将表达式转换为前缀格式。

这是一个例子

 wstring expression = "Feature1 And Feature2";

以下是可能的方法。

 expression = "Feature1 And (Feature2 Or Feature3)";

 expression = "Not Feature1 Or Feature3";

这里AndOrNot是保留字和括号(“(”、 )) 用于范围

具有更高的优先级

And 将下一个优先级设置为 Not

Or 设置为 And 的下一个优先级

WHITE SPACE 用于分隔符。表达式没有其他元素,如 TABNEWLINE

不需要算术表达式。我可以进行评估,但有人可以帮我将字符串转换为前缀表示法吗?

【问题讨论】:

按照惯例,TAB 和 NEWLINE 是 WHITESPACE 的类型。你真的是说空格字符吗?请用该信息澄清您的问题。 将中缀转换为前缀是一项巧妙的家庭作业,但在现实世界中却毫无用处。选项:(A) 解析中缀并执行 (B) 解析中缀,转换为前缀,生成前缀,解析前缀,执行。即使解析前缀更容易,转换过程也更慢。 【参考方案1】:

您需要预先构建语法。那么为什么要手动进行所有解析。 而是使用像 Boost-Spirit 这样的解析器构建器库。或 lex/yacc 或 flex/bison。

然后使用解析器生成器生成的AST 以您认为合适的任何方式输出数据。如中缀转前缀或后缀,...等

【讨论】:

【参考方案2】:

我猜你的意图是评估条件。因此你不需要一个成熟的解析器。

首先你不需要在这里使用字符串。 1. 将“Feature 1”转换为一个Id(表示一个特征的整数)

所以,声明"Feature1 And (Feature2 Or Feature3)";(1 & (2 | 3) 从这里开始......您可以使用标准中缀来进行前缀转换并评估前缀表示法。

这是将中缀转换为前缀的算法 http://www.c4swimmers.esmartguy.com/in2pre.htm http://www.programmersheaven.com/2/Art_Expressions_p1

【讨论】:

为了评估一个条件,你必须解析文本......因此需要某种解析器......此外,从中缀到前缀的转换需要解析,因为必须知道关联规则和运算符正确执行 ti 的优先级... 我想说我们不需要解析。我说过我们不需要像 lex/yacc 这样成熟的解析器。使用 this 进行中缀到前缀转换是一个笑话。即在这种情况下我们不需要构造 AST。【参考方案3】:

使用像 Lex/Yacc 对这样的解析器生成器。

【讨论】:

我更害怕 Lex/Yacc 之类的解析器。我知道它们存在,但我不知道如何有效地使用它们。

以上是关于逻辑条件的 C++ 中缀到前缀转换的主要内容,如果未能解决你的问题,请参考以下文章

算术表达式的前缀,中缀,后缀相互转换

中缀到前缀转换方案

Python中的中缀到前缀转换

中缀前缀后缀表达式的转换

如何在程序中将中缀表达式转换为后缀表达式

使用堆栈(LinkedList)将中缀转换为前缀