跳到内容

安德烈亚贝尔/plt-errata

 
 

文件夹和文件

姓名姓名
上次提交消息
上次提交日期

最新提交

 
 
 

存储库文件导航

plt勘误表

本书勘误表的收集实现编程语言作者:Aarne Ranta。

要添加新勘误表,请创建问题或拉取请求。请使用Github Markdown语法并遵循此页面的风格。然后我将在下面添加勘误表。

勘误表报告人:

  • 安德烈亚斯·阿贝尔
  • 沙赫努尔·伊桑达利
  • 安德烈亚斯·洛夫
  • 纳奇亚潘-瓦利亚潘
  • WASDi公司
  • 亚历山大·库尔兹[#11]
  • 科索罗斯[#12][#13]

已知勘误表

这包括图书网站上列出的勘误表。

第1章,编译阶段

第10页(以及之后的内容):据说Python是一种非类型化语言。这意味着Python没有编译时类型检查。但它确实有一个运行时类型概念,称为动态类型。

第2章,语法

第17页:bnfc后端-java1.4语言不再存在。

第18f页:-java语言backend:根据bnfc 2.8.1,CUP解析器文件被命名为_杯.杯。从2.8.4开始,生成的目录为小写:计算而不是计算

第25页:最后一行:显示(解释e)应该是显示(评估)

p.27:Java示例中有太多的类都有名称EA添加。应该是EA添加,ESub公司,EMul公司,EDiv公司

第34页:两条LBNF规则

SDecl公司。Stm::=类型Id“;”;SDecls公司。Stm::=类型Id“,”[Id]“;”;

可以并且应该简化为

SDecls公司。Stm::=类型[Id]“;”;

哪里

分隔符非空Id“,”;

第三章,词法和句法分析

第41页:通过使初始状态最终,保存ε-转换。

p.41:序列结构可以通过使用作为序列初始状态的第一自动机的初始状态第二个自动机的最终状态作为顺序。这节省了2个ε-转换(并对应于第43页的例子)。

第43页:该NFA不是由第41页的算法生成的。它错过了ε-转变。在这两条路径上,应该有5个ε-跃迁,如2由Union生成,由Sequence构造生成。

第43页:子集构造的结果应该0,1,5作为初始状态,而不仅仅是0第44页。

第46页:数字应该是m b的n b的在通往最终状态(而不是我的不适用).

第53页:解析表缺少goto操作(基本!)。

第53页:与%开始_支出应从表中删除(或解释)。这是相当令人困惑而不是有益的。

第4章,类型检查

p.64练习4-0:“1+2+“你好”+1+2…哪种类型+适用于四个添加项中的每一项。回想一下+左关联!"

此处应添加一个免责声明,即编程语言将允许表达式的值依赖于通常结合的结合顺序的任意选择操作员式+。(在这种情况下,值为“你好12”“12你好3”取决于关联顺序。)理智的语言将保证正常的法律(x+y)+z=x+(y+z)扩展可能。(注意,对于浮点,它只支持大约!)

4.7语句和函数定义的有效性

检查报表的判断应表述为

Γ⊢sΓ'

声明,如整数x;扩展键入上下文。这将允许定义语句序列的检查以自然的方式。实际上是4.11中的Haskell实现它完全像我在这里建议的那样。

4.9必须重写。当前4.9中发生了什么是国家单子配方Γ⊢sΓ'被替换为上下文单体公式Γ⊢ss有效以模块化为代价:我们只能处理语句序列。

4.8声明和块结构

本节应讨论以下范围如果虽然(请参见第5.3节勘误表)。

4.9实施类型检查器

第68页:单个函数类型检查的代码片段中缺少右结束段。

4.10注释类型检查器

第69页:伪代码推断(Γ,a+b)是错误的,因为它从加法表达式的子表达式中删除注释。正确的返回语句是

返回【a】以下为:t)+【b】以下为:t)以下为:t)

第70页:伪代码推断(Γ,a+b)与第69页上的问题相同

4.11 Haskell中的类型检查器

第72-73页:实施推断Bin缺少决赛返回类型

第73页:英寸检查Exp代码,如果(典型值2=典型值)应该是如果typ2==typ它也可以写成

除非(典型2==典型值)$ 失败 $
  "的类型" ++ ...

checkStm(检查标准),有几个错误。正确的代码是:

检查Stm :: 环境 -> Stm公司 -> 错误 环境checkStm环境= 案例属于
  SExp公司 经验 -> 推断Exp环境经验
    返回环境SDecl公司典型x->updateVar env x类型S同时 经验stm公司-> checkExp环境类型库(_B) 经验checkStm(newBlock env)stm返回环境

第74页,第1-3行:使用而不是x个作为语句的变量名。

第75-76页:使用无效而不是对象作为的泛型类型参数参数。更改会影响多个代码段和描述它的文本。

抓是不好的习惯可抛出,因为它包含以下致命的JVM错误内存不足错误堆栈溢出错误。要捕获所有选中的异常,catch(异常e)应该使用。

第5章,口译员

第82页:规则γ⊢xv(v):该v(v)字体设置错误。

5.3报表

目前尚不清楚语句解释器γ⊢sγ'会成交的具有返回不在函数末尾的语句(或打破while循环中的语句)。我建议改为

γ⊢s⇓ ⟨r、 γ'⟩

哪里r::=继续|返回v是语句的结果:通常持续,但是返回v返回语句。这个语句排序的执行将丢弃结果为返回v

第84页:指定的口译员给出了错误的结果

整数 x个 = 0;整数  = 0;虽然(x个++ < 1)整数  = 1;返回 ;

它提供1,而正确的结果是0问题是虽然将覆盖阴影的值为了解决这个问题虽然必须像对待自己的区块一样对待。

请参见http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf以下为:

迭代语句是一个块,其范围是其封闭块的范围。循环体也是块其作用域是迭代作用域的严格子集声明。(第6.8.5节第5句,第135页,绝对值第147页)

可能的修复方法:替换前提γ′sγ″通过γ′.⊢γ″.γ在中的第一条规则虽然

如果必须以类似方式固定,见第6.8.4节第3句。

整数  = 0;如果(1)整数  = 1;其他的 整数  = 2;返回 ;

这应该会返回0,但当前解释器将返回1

可能的解决方案:更换前提γ′sγ″通过γ′. ⊢ γ″.γ在中的第一条规则如果类似于第二条规则。

5.4程序、函数定义和函数调用

第86页,函数调用规则:下标n个在争论中a_n(名词)应该是. [#11]

5.7解释Java字节码

第92页:在最后一条规则中ifeq L,代码指针应变为P+1公司什么时候v!=0

第6章,代码生成

第103页:“最后一个案例是……”“照顾”

第108页第5页:funtypeJVM(…)末尾还有一个括号。

第108页:有一个&它;在类文件模板中就这样<

第112页:在代码片段中代码生成器类,编译(程序p)方法需要缺少方法体或抽象方法声明。

第112页:“只是一个假人对象“。现在,Java有类无效为了那个目的。更改将影响以下代码。

p.105:中间列中while循环的生成代码包含ifeq转到结束.应该是ifeq结束没有goto。

第7章,函数式编程语言

7.3匿名功能

第128页:自C++11以来,C++一直具有lambda函数。现在许多其他主流命令式语言也是如此,例如Java和C#——因此上一页上关于命令式语言的评论有点误导。

7.5按值调用与按名称调用

p.132:在其他地方,符号“λx.e”用于匿名函数,但在调用名应用规则中,符号“∧x改为使用“e”。

第134页:声明了call-by-value和call-by-name之间只有应用规则不同。这是错误的。可变规则,至少如第130页书中所述,也需要改变。书中的变量规则返回了在环境中为变量找到的值,但这只适用于按值调用,因为按名称调用的待赋值表达式存储在环境中,而不是存储在值中。

关于全局和本地绑定的环境组织需要更多讨论:

第134页:有两种环境(即分离函数和变量)是需要处理递归定义:显然,作者忘记了可以有循环数据结构(可以用Haskell等惰性语言直接实现,也可以用Java等变量+引用实现)。(旁注:提到的另一个动机是,应该分离函数和变量以节省内存,但是否节省内存取决于环境的表示方式(例如,考虑链接列表与基于树的地图数据结构)。)

全局绑定和本地绑定的分离不是必需的,但在概念上更清晰,因为全局函数可以绑定到表达式,而本地绑定通常需要绑定到闭包。

7.8多态性

第139页(以及其他地方,如第7.9节):“->”排字错误,如“since”a=d->e”(与下面的箭头进行比较)。

7.9统一的多态类型检查

第142页:英寸推断(f,a):之前推断(a),替换γ必须这样做应用于键入上下文。

第8章,语言设计空间

第157页:BNFC没有移植到Java、C、C++等。;相反,上述语言是作为受支持的后端添加的。

第170页:的规则TAll(全部)TAny公司生成虚假条件。正确的规则是:

TAll kind=父母(“\\p->和[p x | x<-”++kind++“]”);TAny kind=父母(“\\p->或[p x | x<-”++kind++“]”);

附录A

175页:图中的弧实际上是不可追踪的。

附录B

p.193:dcmpl解释应该是“比较if>*”

第194页:将“dcmp,dcmpl”的描述更改为

  • dcmpg,dcmpl:获取并比较堆栈中最顶层的两个双精度数。如果第一个值大于第二个值,则堆栈上剩余的值为1,如果它们相等,则为0;如果第一个值小于第二个值,则为-1。只有当其中一个双精度数是NaN(不是数字)时,操作才会不同。然后dcmpg离开1,dcmpl-1。

关于

《实现编程语言》一书勘误表汇编

资源

星星

观察者

叉子

发布

未发布版本

包装

未发布包