用于编译器学习的简单,正式定义的语言

时间:2011-02-09 10:11:29

标签: compiler-construction

我正在寻找一种简单的,正式定义的语言,可以在学习编译器构造时使用。实施第一遍应该很简单,然后可以进一步优化工作。

随意指出我对lisps的方向,但我也特别寻找其他选择。

4 个答案:

答案 0 :(得分:5)

我可以从http://www.nand2tetris.org/建议使用Jack编程语言吗?

它特别适合学习编译器构建,因为它是学术课程的一部分。

我正在编写一篇关于为C语言编写这种语言编译器的博客文章系列,代码生成为C.我已经在这里发帖:http://blogs.microsoft.co.il/blogs/sasha/archive/tags/Compiler/default.aspx

答案 1 :(得分:3)

我认为Kernighan和Pike的 Unix编程环境的第8章非常出色。它涵盖了Unix环境中的大部分编程,同时实现了编程语言。

第8章称为程序开发。它讨论了通过各个设计阶段开发一个非平凡的程序。这个非平凡的计划是高阶计算器。有关hoc的更多详细信息,请参阅http://en.wikipedia.org/wiki/Hoc_(programming_language

使用标准工具yacc和lex实现简单语言是一个很好的实用介绍。 yacc和lex太多了,无法覆盖这里,但是通过遵循本书中的示例并进行练习,您将了解它们。

发展持续不同阶段;在第一阶段,你甚至没有语言变量。在第三阶段,您有变量,定义常量(PI,E等),以及内置函数,如sin()和log()。到最后阶段,您将拥有完全实现的语言。

现在,is hoc是尝试和实施的最佳语言吗?我不知道,但我知道 Unix编程环境是一本很好的书,可以与传统的编译器书同时阅读。当我开始阅读Aho编辑书(龙书)时,我重读了TUPE的第8章,并按照例子和练习进行了阅读。当然,任何人都可以从书中重新输入代码,但练习要求您对正在发生的事情有充分的了解。

最后,我认为您选择使用哪种语言并不重要,但是在实施时您遵循的过程非常重要。

答案 2 :(得分:2)

我建议Wirth PL/0

为什么?

  • 语法很小,但仍有足够的语言来开发编译器:

    program =
        block "." .
    
    block =
        [ "const" ident "=" number {"," ident "=" number} ";"]
            [ "var" ident {"," ident} ";"]
            { "procedure" ident ";" block ";" } statement .
    
    statement =
        [ ident ":=" expression
        | "call" ident
        | "begin" statement {";" statement } "end"
        | "if" condition "then" statement
        | "while" condition "do" statement
        ].
    
    condition =
        "odd" expression
        | expression ("="|"#"|"<"|"<="|">"|">=") expression
        .
    
    expression =
        [ "+"|"-"] term { ("+"|"-") term} .
    
    term =
        factor {("*"|"/") factor} .
    
    factor =
        ident | number | "(" expression ")" .
    
  • 您可以在C中以大约1000行代码实现PL / 0的虚拟机编译器。

    • 足够重要,但又小到可行。
  • 有三本书与之相关:

    • Wirth,Niklaus(1975),算法+数据结构=程序,ISBN 0-13-022418-9(最初的PL / 0规范和实现(在Pascal中))非常温和的编译介绍。 / p>

    • Liffick,Blaise W.,Ed(1979),The Paste Book of Pascal,ISBN 0-07-037823-1(作者在Northstar Basic中开发PL / 0的次要超集 早期的CP / M计算机。)

    • Wirth,Niklaus(1986),Compilerbau,B.G。 Teubner,Stuttgart ISBN 3-519-32338-9(PL / 0的次要超集,在Modula 2中实现。在德语中)。

  • 网上有很多例子。

    • 我发现了C,C ++,Pascal,Modula 2,Java和Ruby的实现。我敢打赌还有更多。
  • 有一个维基百科条目:: - )

  • 此外,还有一些有用的小组,很多人愿意帮助回答你的编译问题:

答案 3 :(得分:1)

Oberon规范足够小,可用于您的目的:http://www-vs.informatik.uni-ulm.de:81/projekte/Oberon-2.Report/

R5RS或它的纯功能子集也不是那么大(如果忽略数字塔)。