有哪些适合开始编写非上下文自由的编程语言的好资源?
我想写一种编程语言来玩玩,不过我看到的大部分资料都是关于写一种上下文无关语言的。但是我想写一种像Python那样使用缩进的语言。根据我的理解,这意味着它不能是上下文无关的。
12 个回答
我建议你先了解一下这个问题,可以看看一些相关的资料。经典的《编译原理》这本书虽然内容比较复杂,涉及很多数学和计算机科学的知识,但有一本更容易理解的书是Jack Crenshaw写的让我们一起构建编译器系列文章。这是Mr. Crenshaw在80年代末写的一系列文章,是关于编译器的最被低估的作品之一。内容简单明了:Mr. Crenshaw展示了一种有效的“A”方法。你可以在几个晚上内轻松读完这些内容,从而更好地理解编译器是什么。需要注意的是,书中的例子是用Turbo Pascal写的,编译器生成的是68K汇编代码。不过,这些例子很容易转换成更现代的编程语言,我推荐使用Python。如果你想跟着例子一起学习,至少需要Turbo Pascal 5.5和一个68K汇编器和模拟器。这些内容到现在仍然很有用,使用这些旧技术也非常有趣。我强烈推荐这本书作为任何人学习编译器的第一本书。好消息是,像Python和Ruby这样的语言都是开源的,你可以下载并研究它们的C源代码,以更好地理解它们是如何实现的。
你可能会想看看这篇写得不错的文章,讲的是如何解析Python代码,文章标题是《Python: 关于缩进的误解》,你可以在这里找到:Python: Myths about Indentation。
虽然我还没有尝试用像yacc这样的工具写一个无上下文的解析器,但我觉得可以通过使用条件词法分析器来实现,返回缩进变化的标记,具体内容可以参考上面提到的链接。
顺便提一下,这里有来自python.org的官方Python语法文档:http://www.python.org/doc/current/ref/grammar.txt
上下文无关文法,简单来说,就是一种在解析代码时不需要符号表的文法。而上下文相关文法则需要符号表。
D语言就是一个上下文无关文法的例子,而C++则是上下文相关的文法。(比如,T*x是声明x为指向T的指针,还是在把T和x相乘?我们只能通过查看符号表来判断T是类型还是变量。)
空格和这个没有关系。
D语言使用上下文无关文法,这样可以大大简化解析过程,也让一些简单的工具(比如语法高亮编辑器)能够解析它。