我正在尝试定义一种基本语言来构建表达式,我将从代码中评估自己。这些表达式在运行时递归定义。您可以将其视为具有True和False等基本表达式的布尔表达式,并且还涉及复杂的表达式,如表达式的否定以及任意两个表达式的析取和结合。
如上所述,这些表达式是递归的,将在运行时创建,所以我猜模板是别无选择。为此目的,在C ++ 2011中实现键入和评估函数的最合适方法是什么?
任何评论都会受到欢迎,因为我对C ++模式和功能的了解遗憾的是还没有达到目的。
示例非工作代码,它说明了我不需要表达式的任何外部表示(作为字符串):
struct basic {
bool val;
};
struct complex_neg {
expression exp;
};
struct complex_and {
expression exp1, exp2;
};
struct expression : basic, complex_neg, complex_and {
bool eval() {
if (dynamic_cast<basic*>(this)) return this->val;
else if (dynamic_cast<complex_neg*>(this)) return !this->eval();
else return this->eval() && this->eval();
}
};
答案 0 :(得分:1)
一个好的开始是构建表达式和终端的树/有向图。请参阅Abstract syntax tree。
然后评估表达式树。
在C ++中,构建AST的最方便的方法之一就是使用Boost Spirit, see a good introduction。
答案 1 :(得分:1)
你可以尝试的最原始的东西是Shunting-yard algorithm反向抛光表示法。
您可以做的最专业的事情是使用boost spirit
你能做的最糟糕的事情就是为你的特定语法实现一个ll解析器。但是你需要了解一些关于语言解析器的理论。