C++制作了一个松散类型的语言解析器
C++ making a loosely typed language parser
我正在考虑用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
类,这可能是你唯一能做的事情——存储一个指针和关于它所指向的类型的信息。
- r语言 - C++ 类型为"const std ::?
- 是否可以用类似C/C++(或任何语言)的语言,从作为用户输入的字符串或文件中创建用户定义的数据类型
- LLVM:如何在运行时跟踪非类型语言的 Value* 的数据类型?
- C ,vs 2015,致命错误:重复资源.类型:清单,名称:1,语言:0x0409
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- 我如何使用GO语言读取可能是两种不同数据类型之一的HDF5属性
- 使用 LLVM IR 实现动态类型语言
- 对于不确定值的无符号字符类型,标准中特殊语言对于左值到右值的转换有什么意义?
- C++制作了一个松散类型的语言解析器
- C++语言功能可简化命名类型(尤其是在函数声明中)
- 动态C++与其他语言的比较 - 在不知道类型的情况下无法在对象上调用方法
- 如何为动态类型语言构建编译器
- 如何使C枚举类型可用于其他语言
- C++在编写脚本语言时如何处理类类型
- Java 编程语言中的数据类型如何映射到本机编程语言(如 C 和 C++)中的数据类型
- C++是静态类型语言,为什么我们可以在运行时获取类型
- GCC 编译器上布尔类型的 C 和C++语言的默认初始值设定项是 64 而不是 0。这是编译器错误?
- C++仍然被视为静态类型语言
- c++在多大程度上是一种静态类型语言?
- 静态类型语言中的合并运算符