C ++创建一个松散类型的语言解析器

时间:2014-02-15 00:20:46

标签: c++ scheme lisp

我正在考虑在C ++中实现一个非常小的松散类型的语言。

我知道C和C ++可用于制作新的编程语言,但我完全迷失了如何绕过严格的类型执行。

我需要能够存储任何值(char,int,double,std :: string是我支持的) 然后能够检索它。

我知道您可以将类型作为字符串存储在具有void *的结构中。但是即使在你取消内部价值之后,很难找到一种方法来存储它们。

我知道你可以使用模板化的类,但我认为它使得该类的成员只能是指定的模板,即使这样也不能改变类型。

我正在制作一个Lisp变体,所以我需要一个具有内部值的Cell类,该内部值可以是上面列出的任何类型。 (请查阅Lisp“cons”单元格,了解为什么我需要一个可以重新分配的数据成员)

编辑: 让我补充一点,这将是一种解释型语言,不需要编译成原始C ++。

3 个答案:

答案 0 :(得分:2)

我建议像

struct Value {
    enum Tag { Char, Int, Double, String } m_Tag;
    union {
        char m_char;
        int m_int;
        double m_double;
        std::string m_string;
    } u;
};

当然这不会像写的那样工作,因为你不能在一个union中有一个带有构造函数(string)的类型。 但是C ++ 11放宽了这个限制。

答案 1 :(得分:1)

创建编程语言时,关键步骤是解析代码并将其转换为其他代码。在我认为你陷入困境的地方就是你的想法。你正在设想用c / c ++进行设置,这样你就可以使用你以“松散类型”的方式创建的实际类。相反,您的流程将更像这样:

  • 阅读以您的新语言撰写的文字
  • 通过查看文本
  • 找出作者所输入的“类型”
  • 生成适当处理其代码的c / c ++(或任何其他语言)代码

最终转换可能会将代码更改为看起来完全不同的内容。您可以在此处定义使您的语言“松散输入”的所有规则。

由于您在严格类型的系统之上创建了一个松散类型的系统,因此您必须为您感兴趣的所有可能情况定义所有逻辑。

我只想说这不是佯攻的任务。以下是完成任务所需的工具列表(或至少我将使用的工具):

祝你好运。

答案 2 :(得分:0)

  

我知道您可以将类型作为字符串存储在具有void *的结构中。但是即使在你取消内部价值之后,很难找到一种方法来存储它们。

你说“将所有始终存储是什么意思?他们始终位于指针指向的位置。指针将始终如一< / strong>具有相同的大小,无论它实际存储的是什么。并且您将能够始终知道string描述值的类型。您甚至可以使用单个char来存储类型信息(因为您只需要4个值)。

如果你想创建一个variable类,这可能是你唯一可以做的事情 - 存储一个指针信息关于它所指向的类型