结合异构递归类型以定义子语言

时间:2016-04-06 10:30:35

标签: c++11 recursion types

我正在尝试定义一种基本语言来构建表达式,我将从代码中评估自己。这些表达式在运行时递归定义。您可以将其视为具有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();
    }
};

2 个答案:

答案 0 :(得分:1)

一个好的开始是构建表达式和终端的树/有向图。请参阅Abstract syntax tree

然后评估表达式树。

在C ++中,构建AST的最方便的方法之一就是使用Boost Spirit, see a good introduction

答案 1 :(得分:1)

你可以尝试的最原始的东西是Shunting-yard algorithm反向抛光表示法。

您可以做的最专业的事情是使用boost spirit

你能做的最糟糕的事情就是为你的特定语法实现一个ll解析器。但是你需要了解一些关于语言解析器的理论。

相关问题