C++制作了一个松散类型的语言解析器

C++ making a loosely typed language parser

本文关键字:类型 语言 一个 C++      更新时间:2023-10-16

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

我知道C和C++可以用来制作新的编程语言,但我完全不知道如何绕过严格的类型强制。

我需要能够存储任何值(我将支持char、int、double、std::string)然后能够取回它。

我知道你可以将类型存储为一个带void的结构中的字符串。但是,即使在取消引用内部的值之后,也很难找到一致存储它们的方法。

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

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

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

我建议使用

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;
};

当然,这不会像编写的那样工作,因为在联合中不能有带构造函数(字符串)的类型。但C++11放宽了这一限制。

创建编程语言时,关键步骤是解析代码并将其翻译成其他语言。我认为你陷入困境的地方在于你的思维。你想象的是在c/c++中设置一些东西,这样你就可以以一种"松散类型"的方式使用你所创建的实际类。相反,您的流程将更像这样:

  • 阅读用新语言编写的文本
  • 通过查看文本找出作者输入了什么"类型">
  • 生成适当处理代码的c/c++(或任何其他语言)代码

最终的转换可能会将他们的代码更改为看起来完全不同的代码。在这里,您可以定义使您的语言"松散类型化"的所有规则。

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

只要说这不是一项心佯装的任务就足够了。以下是完成任务所需的工具列表(或者至少是我要使用的工具):

  • 一个正则表达式库来解析它们的文本
  • 定义语言的无上下文语法
  • 用于验证代码的lexer
  • 各种面向对象的类来表示您的数据
  • 生成最终代码的编译器
  • 一大堆知识和毅力

祝你好运。

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

您说"一致地存储所有是什么意思?它们将一致地位于指针指向的位置。无论实际存储什么,指针都将一致地具有相同的大小。您将能够一致地知道值的类型,string会对其进行描述。您甚至可以使用单个char来存储类型信息(因为您只需要4个值)。

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