C++11 组合异构递归类型以定义子语言

C++11 组合异构递归类型以定义子语言,c++11,recursion,types,C++11,Recursion,Types,我正在尝试定义一种基本语言来构建表达式,我将从代码中对自己进行评估。此类表达式在运行时递归定义。您可能会认为它是布尔表达式,具有基本表达式,如True和False,还涉及复杂表达式,如表达式的求反以及任意两个表达式的析取和合取 如前所述,这样的表达式是递归的,将在运行时创建,所以我想模板是没有选择的。为了实现这个目的,在C++ 2011中实现键入和评估函数最合适的方式是什么? P>任何评论都是受欢迎的,因为我对C++模式和特征的了解还不太远。 示例非工作代码,说明了我不需要表达式(作为字符串)

我正在尝试定义一种基本语言来构建表达式,我将从代码中对自己进行评估。此类表达式在运行时递归定义。您可能会认为它是布尔表达式,具有基本表达式,如True和False,还涉及复杂表达式,如表达式的求反以及任意两个表达式的析取和合取

如前所述,这样的表达式是递归的,将在运行时创建,所以我想模板是没有选择的。为了实现这个目的,在C++ 2011中实现键入和评估函数最合适的方式是什么?

<> P>任何评论都是受欢迎的,因为我对C++模式和特征的了解还不太远。 示例非工作代码,说明了我不需要表达式(作为字符串)的任何外部表示的事实:

struct-basic{
布尔瓦尔;
};
结构复合体{
表达实验;
};
结构复合体{
表达式exp1,exp2;
};
结构表达式:基本、复数、复数和{
bool eval(){
if(dynamic_cast(this))返回this->val;
否则如果(dynamic_cast(this))返回!this->eval();
否则返回this->eval()&&this->eval();
}
};

一个好的开始是构建表达式和终端的树/定向图。看

然后计算表达式树


在C++中,使用AS.SO的最方便的方法之一是使用.< /P>

。一个好的开始是建立一个树/有向图的表达式和终端。看

然后计算表达式树


<>在C++中,使用AS.SO的最方便的方法之一是使用.< /P>

。你可以尝试的最原始的方法是用逆波兰表示法。

你能做的最专业的事情就是使用


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

您可以尝试的最原始的方法是使用逆波兰语符号

你能做的最专业的事情就是使用



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

谢谢您的早期回复。我忘了提到使用第三方库不是我能负担得起的选项,因为代码将针对手机应用程序。请注意,仅标题库(如下面提到的Boost.Spirit)不是问题,因为它们没有您必须向用户提供的二进制文件。谢谢,但我仍然相信我的问题要简单得多,不需要任何外部库。我添加了进一步的信息,使我的问题更加详细。
表达式继承自
基本
复杂_neg
复杂_和
意味着它是这三个类的组合,而不仅仅是其中的一个。因此,第一个
dynamic_cast
将始终通过。谢谢。我怎样才能表示这是他们中的任何一个呢?谢谢你的早日回复。我忘了提到使用第三方库不是我能负担得起的选项,因为代码将针对手机应用程序。请注意,仅标题库(如下面提到的Boost.Spirit)不是问题,因为它们没有您必须向用户提供的二进制文件。谢谢,但我仍然相信我的问题要简单得多,不需要任何外部库。我添加了进一步的信息,使我的问题更加详细。
表达式继承自
基本
复杂_neg
复杂_和
意味着它是这三个类的组合,而不仅仅是其中的一个。因此,第一个
dynamic_cast
将始终通过。谢谢。我怎样才能表示这是他们中的一个呢?谢谢。我需要的语法不适用于用户可读的表示形式,如字符串。我的问题涉及C++类型和其他特征如何定义这种递归语法(即类继承)。你说的是表达式模板吗?这确实是一个选择。我将添加一些代码来说明。谢谢。我需要的语法不适用于用户可读的表示形式,如字符串。我的问题涉及C++类型和其他特征如何定义这种递归语法(即类继承)。你说的是表达式模板吗?这确实是一个选择。我将添加一些代码来说明。谢谢。我是一个具有基本数据结构的知识,但到目前为止,还没有线索如何实现它——C++中最简单的方法。很遗憾,没有捷径可走。谢谢。我是一个具有基本数据结构的知识,但到目前为止,还没有线索如何实现它——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();
    }
};