Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 用于编译器学习的简单、正式定义的语言_Compiler Construction - Fatal编程技术网

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

Compiler construction 用于编译器学习的简单、正式定义的语言,compiler-construction,Compiler Construction,我正在寻找一种简单、正式定义的语言,可以在学习编译器构造时使用。实现第一个过程应该很简单,然后可以进行进一步的优化工作 请随意向我指出lisps的方向,但我也在特别寻找其他选项。我可以向您推荐Jack编程语言吗 它特别适合学习编译器构造,因为它是学术课程的一部分 我正在写一系列关于用C#为这种语言编写编译器的博客文章,其中包含C的代码生成。我已经在这里发表了一些文章:Oberon规范对于您的目的来说足够小了: R5R或它的纯函数子集也没有那么大(如果你忽略数字塔)。我建议使用沃思的 为什么?

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


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

我可以向您推荐Jack编程语言吗

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


我正在写一系列关于用C#为这种语言编写编译器的博客文章,其中包含C的代码生成。我已经在这里发表了一些文章:

Oberon规范对于您的目的来说足够小了:

R5R或它的纯函数子集也没有那么大(如果你忽略数字塔)。

我建议使用沃思的

为什么?

  • 语法很小,但仍然有足够的语法让您对开发编译器有一个良好的体验:

    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 ")" .
    
    程序=
    块“.”。
    挡块=
    [“const”ident“=“number{”,“ident”=“number}”;“]
    [“var”ident{,“ident}”;“]
    {“procedure”ident“;“block”;“}语句。
    声明=
    [ident]:=“表达式
    |“呼叫”标识
    |开始“语句{”;“语句}”结束
    |“如果”条件“那么”语句
    |while“condition”do“语句
    ].
    状况=
    “奇”字
    |表达式(“=”|“#”|“=”)表达式
    .
    表情=
    [“+”|“-”]项{(“+”|“-”)项}。
    术语=
    因子{(“*”|“/”)因子}。
    因素=
    识别号“(“表达式”)”。
    
  • 您可以用大约1000行代码在C中实现PL/0的虚拟机编译器

    • 大到足以不平凡,但小到足以可行
  • 有三本书与此相关:

    • Niklaus(1975),《算法+数据结构=程序》,ISBN 0-13-022418-9(最初的PL/0规范和实现(Pascal)),这是一个非常温和的编译介绍

    • Liffick,Blaise W.,Ed(1979),《Pascal的字节书》,ISBN 0-07-037823-1(作者开发了一个PL/0的小超集,在Northstar Basic中用于 早期的CP/M计算机)

    • Niklaus Wirth(1986),Compilerbau,B.G.Teubner,斯图加特ISBN 3-519-32338-9(PL/0的小型超集,在模块2中实现,德语)

  • 网络上充满了例子

    • 在C、C++、Pascal、MuleMax 2、java和Ruby中找到了实现。我敢打赌还有更多
  • 有一个维基百科条目::-)

  • 此外,还有几个有用的小组,许多人愿意帮助回答您的编译器写作问题:

    • 此外,Usenet新闻组是获取信息的好地方


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

第八章叫做程序开发。它讨论了通过设计的各个阶段开发一个非平凡的程序。这个非平凡的程序是hoc,高阶计算器。有关hoc的更多详细信息,请参阅)

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

发展经历了不同的阶段;在第一阶段,语言中甚至没有变量。到了第三阶段,您就有了变量、定义的常量(PI、E等)和内置函数,如sin()和log()。到最后一个阶段,您已经拥有了完全实现的语言

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


最后,我认为选择哪种语言并不重要,但实现它的过程是什么。

您可以尝试实现Pascal的一个子集;看看Hehe,我有一本关于为Oberon的子集构建编译器的书。这似乎非常适合这项任务。