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

10

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

这里是一个例子

 wstring expression = "Feature1 And Feature2";

以下是可能的方法。

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

 expression = "Not Feature1 Or Feature3";

在这里,AndOrNot是保留字,圆括号("("和)")用于限定作用域。

Not具有更高的优先级。

And的优先级次于Not

Or的优先级次于And

空格用作分隔符。表达式中没有其他元素如TABNEWLINE

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


按照惯例,TAB和NEWLINE是空格的一种。你真的是指空格字符吗?请提供更多信息澄清你的问题。 - Jason D
将中缀表达式转换为前缀表达式是一个不错的作业任务,但在现实世界中却毫无用处。选项:(A)解析中缀表达式并执行;(B)解析中缀表达式,将其转换为前缀表达式,生成前缀表达式,解析前缀表达式并执行。即使解析前缀表达式更容易,但是“转换”过程更慢。 - Mooing Duck
3个回答

3
你需要事先构建好语法。所以为什么要手动进行所有解析呢?相反,使用诸如Boost-Spirit之类的解析器生成库。或者使用lex/yacc或flex/bison。
然后使用解析器生成的AST以任何你认为合适的方式输出数据。例如中缀转前缀或后缀等。

1

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

首先,在这里你不需要使用字符串。 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


1
为了评估一个条件,你必须解析文本...因此需要某种解析器...另外,从中缀转换为前缀需要解析,因为人们必须知道运算符的结合规则和优先级才能正确地执行它... - Jason D
1
我并没有说我们不需要解析。我是说我们不需要像lex/yacc那样的完整解析器。使用这种方法进行中缀转前缀转换是一个笑话。也就是说,在这种情况下,我们不需要构建AST。 - SysAdmin

-1
使用类似于Lex/Yacc的解析器生成器。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接