【发布时间】:2010-12-17 05:33:47
【问题描述】:
出于我自己的学习经验,我想尝试用 C 语言为简单的编程语言编写解释器——我认为我需要的主要是一个哈希表库,但数据结构和辅助函数的通用集合将是很有帮助。大家有什么推荐的?
【问题讨论】:
标签: c interpreter
出于我自己的学习经验,我想尝试用 C 语言为简单的编程语言编写解释器——我认为我需要的主要是一个哈希表库,但数据结构和辅助函数的通用集合将是很有帮助。大家有什么推荐的?
【问题讨论】:
标签: c interpreter
libbasekit - 作者是 Io。你也可以使用 libcoroutine。
【讨论】:
我推荐研究的一个库是 libgc,a garbage collector for C。
您可以通过将调用 malloc、realloc、strdup 等替换为对应的 libgc(例如 GC_MALLOC)来使用它。它通过扫描堆栈、全局变量和 GC 分配的块来工作,寻找可能是指针的数字。信不信由你,它实际上表现得相当好(几乎与 非常好 ptmalloc 相提并论,这是 GNU/Linux 中的默认(非垃圾收集)malloc 实现),并且很多程序都使用它(包括Mono 和GCJ)。但是,一个缺点是它可能无法与您可能想要使用的其他库很好地配合使用,您甚至可能必须手动重新编译其中一些以将对 malloc 的调用替换为 GC_MALLOC。
【讨论】:
老实说 - 我知道有些人会因此而讨厌我 - 但我建议你使用 C++。你不必为了能够开始你的项目而鼓起勇气去学习它。只需像 C 一样使用它,但在一个小时内,您可以学习如何使用 std::map(关联容器)、std::string 来轻松处理文本数据,以及 std::vector 来实现可调整大小的堆-分配的数组。如果你想多花一两个小时,学会把成员函数放在类中(不要担心多态性、虚函数等),你会得到一个更有条理的程序。
【讨论】:
对于具有简单结构的适当小型语言,您只需要标准库即可。解释语言中最复杂的部分可能是expression evaluation。为此,您需要了解和实现堆栈数据结构,过程调用和构造嵌套。
上面链接中的代码是 C++,但是算法描述得很清楚,你可以很容易地用 C 重新实现它。同样,没有使用 C++ IMO 的有效论据很少。
【讨论】:
在深入研究要使用的库之前,我建议您了解语法和编译器设计。尤其是输入解析对于编译器和解释器来说是类似的,即分词和解析。标记化过程将流字符(您的输入)转换为标记流。解析器获取此标记流并将其与您的语法匹配。
您没有提及您正在为哪种语言编写解释器。但很可能该语言包含递归。在这种情况下,您需要使用所谓的自底向上解析器,您无法手动编写该解析器,但需要生成该解析器。如果您尝试手动编写这样的解析器,最终会导致容易出错的混乱。
如果您正在为 posix 平台开发,那么您可以使用 lex 和 yacc。这些工具有点老,但对于构建解析器来说非常强大。 Lex 可以生成实现标记化过程的代码,而 yacc 可以生成自底向上的解析器。
我的回答提出的问题可能比它回答的要多。这是因为编译器/解释器领域非常复杂,不能简单地用简短的回答来解释。买一本关于编译器设计的好书。
【讨论】: