我想练习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函数?
此外,非常欢迎有关此设计的建议。
答案 0 :(得分:1)
你不能(正如我所说)写一个C解释器。 击>
你会有我认为写一个C解释器真的很难。
你可能不得不写一个编译器
当然,您可以即时“剖析”语言,在进度时解析代码
真正的问题(我认为),将处理外部引用。
在Python中,您使用import
关键字处理外部参考
如您所知,某些库可能存在冲突方法(例如lxml
和libxml2
)
import
正确的库可解决此冲突
您当然可以想到一些有效“链接”或导入所有必需外部参考的机制
这可能会有一些非常具体的假设
这样,当您遇到#include <stdlib.h>
时,实际上import
它
就此而言,导入它可能意味着在Windows下使用stdlib
或LoadLibrary()
等内容加载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 */
}
这只是表明与语境相关的语法是多么棘手。