是否有更现代的,可能是面向对象的,相当于Jack Crenshaw的“ Let's Build a Compiler ”系列?

不久前,我偶然发现了“ 让我们构建一个编译器 ”,并且无法抗拒编写一些代码。 我在C#中编写了一个递归下降的C编译器,输出.NET CIL。 “写一次,到处泄漏”是我的口号。

太糟糕了,直到太晚才发现解析C是一场噩梦。

我现在有兴趣用Java编写一个Java编译器,它输出.NET CIL或程序集,目的是自引导。 我希望可能会有更新的教程。

另外,您是否会花更多时间进行前期设计,或者只是编写大量测试来支持无情重构的能力。 回想起来,我倾向于后者。 编译器工作但代码非常糟糕。

===============>>#1 票数:6

听起来你完全错过了Crenshaw的教程。 LBC不是要编写漂亮,干净或高效的代码。 所有这一切都是为了将​​一些沉浸在形式理论中的东西降低到一个水平,在这个水平上,随意的编码器可以轻松快速地破解一个基本的(但工作!)编译器。

当我几年前阅读LBC时,我用C#重写了这些例子。 我确定课程布局不是最好的,或者任务分开正确,但它与他的Pascal相当。 如果您愿意,我很乐意与您分享代码 - 让我知道,我可以在线发布并分享链接。

在业余时间,我一直在讨论一些写作,目的是将LBC和编译器设计基础的哲学统一起来 - 在每个单元/章的末尾用实际的工作代码走开,同时讨论一些理论在探索这些想法之后,读者会理解为什么事情就是这样。 但是Crenshaw花了很多年才写出他不完整的系列,所以我的我是个梦想......而且我使用C(完全是因为它不是C ++或Java)。

===============>>#2 票数:4

看看Terence Parr的“语言实现模式” 他写了一个ANTLR - 一个用于Java的解析器生成器 - 所以他知道他的东西。 它很好地解释了编译器设计的原理并逐渐建立起来。

Martin Fowler的“Domain Specific Languages”也很好。 它与纯粹的编译器课程略有不同,但它是语言设计关键概念的一个很好的参考。

===============>>#3 票数:2

我最近在我的公司使用BNFC构建了一个编译器,起初我被指示使用Flex和Bison(C / C ++),但我发现它们很痛苦所以我使用BNFC来生成Flex和Bison文件。

不能说我喜欢这个代码,我的语法很大,生成的访问者也是如此,但是我无法处理,我从一开始就TDDed所以我总是有足够的测试来重构,但我也保留了一个UML图表帮助我思考我写的其他课程。

实际上有一本名为“ 实现编程语言 ”的书自称为“自学书,在某种程度上,是BNFC工具的手册”,如果我读到它,我可能会对实施决策的努力减少但总的来说我找到了BNFC足够直观,只需阅读手册教程即可使用它

最后但并非最不重要的是,它也可以与其他语言一起使用,包括Java(使用Cup和JLex)

===============>>#4 票数:2

我是“MiniJava”的粉丝以及基于“Java中的现代编译器实现”系列书籍的相关工作。 这并不完全符合您提到的所有要求,因为MiniJava实现通常会生成本机代码 - 但后端可以轻松更改为发出MSIL或其他任何内容。

===============>>#5 票数:1

你看过PyPy项目了吗? 它是Python语言的Python实现。 也许它可以为你自我引导Java的目标提供一些灵感?

===============>>#6 票数:1

如何编写编译器和解释器:Ronald Mak的软件工程方法

===============>>#7 票数:0

在考虑学习这些东西时,你应该看看书籍语言实现模式antlr-reference

===============>>#8 票数:0

如果您想通过示例学习, Finch的代码,我的一点编程语言:

  1. 是用面向对象的C ++编写的。
  2. 很干净。
  3. 包括字节码编译器。

===============>>#9 票数:0

用Java编写Watt&Brown的编程语言处理器怎么样? 它演示了(简单)编译器设计中使用的OO模式。 我成功地使用了C#。

  ask by Justin translate from so

未解决问题?本站智能推荐:

1回复

Java编译器可以优化递归方法添加到集合中吗

出于好奇,主要问一个简单的问题,即什么Java编译器足够聪明。 我知道不是所有编译器的构建方式都一样,但是我想知道其他人是否认为期望对我可能会遇到的大多数编译器进行优化是合理的,而不是在特定版本或所有版本上都可以进行优化。 因此,可以说我有一些树形结构,我想收集节点的所有后代。 有两种
2回复

如何重构此代码并应用OO模式?

我的RichTable中有四个RichTable实例,并且有一个current表实例的概念。 取决于标志resetAll我需要清除所有表或除当前表以外的所有表的选择 。 如果resetAll为true,则清除所有内容,否则忽略当前内容。 当前表的索引作为参数传递给执行清除操作的方法。
3回复

demeter定律 - 只使用一个点,我可以改进这个逻辑吗?

我有以下方法: 它位于Reservation类中。 这个类有一个Show Object(show),一个show有Rows(另一个对象),Rows有Seats(另一个对象)。 我的问题是这种方法可以改进吗? 我已经阅读了有关LoD的内容并担心我的点会发出错误的设计,尽管我认为这
3回复

依赖注入-我是否正确重构了代码?

我正在尝试这个问题,以准备测试。 根据我的理解,这是我最好的答案,但我觉得我可能缺少一些重要的东西。 我认为我已经改变了Navigator的职责,但是我看不到更好的方法。 问题是: 重构Navigator和GPS类以使其符合Dependency Injection模式。 不要
1回复

新的孩子班还是有条件的孩子从同一个孩子那里读?

可以说我上了一堂课: 我要填充: x如果y = a 如果y = b,则为z 也就是说,带有构造函数的Foo看起来像: y被初始化为支持对象将来的决策,即根据值y,我将读取x或z。 扩展Foo并执行此操作是否使OOP有意义: 如果满足了使y等
3回复

如何使用许多单一责任的方法重构一个大类?

搜索设计模式和更好的代码优化主要是关于如何创建类图的类和工具之间的继承和关系的文章。 我想对一个大班的怎么说,分开一点。 我正在开发一个java程序,其中一个类已经超过了1600行代码和大约20种方法。 它的作用是从数据源查询数据并生成大量文本文件。 现在有很多数据修改逻辑(对于我创
3回复

OOP访问修饰符:编译时或运行时

我听说Access Modifiers Public, Private and Protected只是一些Compiler Stuff,它们实际上并不存在于已编译的二进制代码中 。 现在我想知道它是多少是正确的? 如果它是正确的,是否意味着在运行时二进制代码中不存在封装 ? 因此,如果
5回复

练习递归和OO设计的任何网站/书籍/技巧? [关闭]

我只是想知道是否有任何网站在练习递归和OO设计方面存在问题(给定一些设计类/接口结构的实体)? 我理解需要递归的问题的解决方案没有任何困难,但我似乎无法应用递归到一个新的问题。是否有任何技巧来应用递归? 如果这个问题非常愚蠢,我道歉!
2回复

构建ArrayList树-Java

如何从ArrayList构建基本的对象树(在本例中为下面我的Person类中的Person对象)? 从概念上讲,我了解树的工作原理,如何将对象添加到我的数组列表中,但是树的构建方面以及将节点链接在一起时遇到了很多麻烦,我似乎觉得不知所措。 而且,从我所做的研究来看,似乎递归算法是解决此问题的
2回复

破解编码面试第5版,9.10

在“破解编码面试”(第5版)中,提出了以下问题: 您有一堆n个宽度为w(i),h(i)和d(i)的盒子。 如果堆叠中的每个盒子的宽度,高度和深度均严格大于其上方的盒子,则这些盒子不能旋转,只能堆叠在一起。 实现一种方法来构建可能的最高堆栈,其中堆栈的高度是每个盒子的高度之和。 我