是否可以将结构与条件语句完全相同的字符串转换为可以读取和操作的语句?

Is it possible to convert a string, structured exactly like you would a conditional statement, into a statement that can be read and operated upon?

我和其他一些人的任务是为我们的第一年项目创建一个 Truth Table 生成器。我们已经完成了绝大部分工作,除了一些事情,其中​​最重要的是实际将语句(例如:p V q)转换为布尔真值的函数。

是否可以将具有适当 c++ 参数语法的字符串语句(例如“(p || !q)”(p 和 q 是具有各自值的预定义变量)直接转换为条件?

我们已经根据我们可以通过字符串分析找到的内容考虑了许多条件语句的路径,并根据发现对变量进行操作,但我想知道是否有更有效的方法来实际编写它。该代码旨在为 truth table 语句获取几乎所有输入,将其转换为正确的 c++ 语法,并将语句分成组件。话虽这么说,如果我们要通过查找某些元素并使用 if-then 或 switch 语句对它们进行操作来做到这一点,则有很多选择可以考虑。如果有更有效的路线,我愿意接受建议,欢迎对我们的流程提出任何批评。

作为视觉演示,这就是我们的想法:

bool p=1, q=0;
string test= "(!p || q)"; // would supposedly return 0 if analyzed as a conditional statement

cout << endl << "Truth Table Generator Test" << endl;
cout << "p = " << p << endl << "q = " << q << endl;
cout << test << " = " << truthVal(test) // Used to signify the conversion from string to condition

预期输出:


Truth Table Generator Test
p = 1
q = 0
(!p || q) = 0

没有。 运行 时间的 C++ 对编译时变量名的访问为零,在某些编译器中的某些符号处理之外。

甚至 "constexpr runtime" 也无法访问它。

像这样调用时在 C++ 中是不可能的:

cout << test << " = " << truthVal(test) 

但是,稍微重新排列一下,就有可能:

bool p=1, q=0;
char test[]= "(!p || q)"; // would supposedly return 0 if analyzed as a conditional statement

cout << endl << "Truth Table Generator Test" << endl;
cout << "p = " << p << endl << "q = " << q << endl;
cout << test << " = " << truthVal(test, 'p', p, 'q', q)

这之所以成为可能,是因为有 2 个重大变化。 test 现在是一个常量字符数组。因此,它可以用模板元编程来解析。请注意,不同的 test 数组可以产生独特的函数实例化。例如,这是在 Boost 的 printf 库中完成的。由于模板元编程是图灵完备的,因此可以实现一个解释器来测试 p 和 q,或者在 运行 时间测试任何额外数量的变量。您还需要定义一个约定 link 与 char 数组中的变量一起传递的变量。我在这里通过将变量名称作为 char 提供来完成此操作,但也可以通过其他方式完成。您甚至可以对传递的变量进行类型检查。但是您无法访问未在函数调用中传递的变量。本质上,您正在实现一个编译时解释器。

但是,模板元编程是一项意义重大的任务。但可行。