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