为交互式C代码编写C-Interpreter

时间:2013-08-04 22:10:50

标签: c interpreter

我想练习C,所以我决定以python解释器的精神编写一个C语言解释器。我有一些C知识,但我一直都是通过做类型的程序员来学习。

到目前为止,我很简单。只需解析用户的输入,一次一行,并区分声明,如:

int x = 10;
char c = 'a';

我在其中创建一个结构,表示int值的变量类型,名称和ivalue以及char值的cvalue。除了一步一步,还有更多的东西可以去那里。

我也可以解析函数调用,如下:

printf("value of x = %d\n, x);

我在其中提取函数的名称,并将args存储在char ** args。

这听起来很愚蠢,但我想避免为每个标准c库函数编写一个映射器,以便执行对printf或strstr或strcpy之类的调用。反正有没有这种方法动态调用标准c函数?

此外,非常欢迎有关此设计的建议。

1 个答案:

答案 0 :(得分:1)

你不能(正如我所说)写一个C解释器。
你会有我认为写一个C解释器真的很难。 你可能不得不写一个编译器 当然,您可以即时“剖析”语言,在进度时解析代码 真正的问题(我认为),将处理外部引用。

在Python中,您使用import关键字处理外部参考 如您所知,某些库可能存在冲突方法(例如lxmllibxml2import正确的库可解决此冲突 您当然可以想到一些有效“链接”或导入所有必需外部参考的机制 这可能会有一些非常具体的假设 这样,当您遇到#include <stdlib.h>时,实际上import它 就此而言,导入它可能意味着在Windows下使用stdlibLoadLibrary()等内容加载LoadLibraryEx的dll。 加载你遇到的所有#include's之后,如果你没有找到引用的定义,那么你可能会遍历本地dir'获取额外的C文件,直到你遇到所寻求的引用,此时我我不确定该怎么办。
这是关于链接问题(我老实说,如果没有适当的编译,你不会看到你将如何克服)。

另一部分实际上也非常难。你需要写一个Lexer 那就是解析所有C代码行的小魔鬼 我假设你已经摆弄了一个Scheme / List解释器编写,或者甚至是一些更复杂的解析器 谨防! C不是Scheme!
这是一种非常复杂的解析语言。它的描述文件跨越数百页 写一个C词法分子不是写口译员的练习 C有一些讨厌的上下文相关的解析 - 这基本上意味着它不是CFL(上下文无关语言) - 这意味着你不能编写一个很好的有限自动机来解析它。

我将以an example的精彩博客中的Eli Bendersky结束。

typedef int AA;
void foo()
{
    AA aa;       /* OK - define variable aa of type AA */
    float AA;    /* OK - define variable AA of type float */
}

这只是表明与语境相关的语法是多么棘手。