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新闻组是获取信息的好地方
最后,我认为选择哪种语言并不重要,但实现它的过程是什么。您可以尝试实现Pascal的一个子集;看看Hehe,我有一本关于为Oberon的子集构建编译器的书。这似乎非常适合这项任务。