《编译原理实验教程》勘误表

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《编译原理实验教程》勘误表2010/6/12最新修订教材部分2010-6-171.P289表8-1上方倒数第4行中,“ud链的映射表”改成“du链的映射表”。(注:最初提交给出版社的电子文件中是“du链的映射表”。)2010-6-91.P115倒数第6行中assignment_expression=lvalueassignment_operatorassignment_expression改成assignment_expression=lvalueassignment_operatorexpression2010-5-251.P293示例代码8-5中,为强调getAIRreg()需要自行编写而增加注释信息,即airsrc=getAIRreg(result.getRegID());改成airsrc=getAIRreg(result.getRegID());//getAIRreg()需要自行编写2.P294示例代码8-7中存在花括号不匹配,故将for(IteratorLIRVariableTypevarit=vartype.iterator();varit.hasNext();){LIRVariableTypevar=varit.next();AIROperand[]operands=newAIROperand[3];operands[0]=factory.newSymbol(var.getVariableName());operands[1]=factory.newImmNumber(size);operands[2]=factory.newImmNumber(alg);varstmts.add(factory.newDirective(Director.COMM,operands));改成for(IteratorLIRVariableTypevarit=vartype.iterator();varit.hasNext();){LIRVariableTypevar=varit.next();AIROperand[]operands=newAIROperand[3];operands[0]=factory.newSymbol(var.getVariableName());operands[1]=factory.newImmNumber(size);operands[2]=factory.newImmNumber(alg);varstmts.add(factory.newDirective(Director.COMM,operands));}2010-5-171.P338(附录4)第1行中assignment_expression=IDENTIFIERassignment_operatorassignment_expression改成assignment_expression=IDENTIFIERassignment_operatorexpression2.P339(附录5)第18行、P341(附录6)第16行中assignment_expression=lvalueassignment_operatorassignment_expression改成assignment_expression=lvalueassignment_operatorexpression2009-7-221.P27,第5行,将“实验支持库平台”改成“实验支持库”。2.P37,倒数第3行,将“对ir进行代码输出”改成“对ir进行代码生成”。3.P158,示例代码4-20中的第11行for(inti=0;i6;i++)jj_la1[i]=-1;改成for(inti=0;ijj_la1.length;i++)jj_la1[i]=-1;4.P158,在倒数第3段之后增加如下一段文字:注意:示例代码4-20中第7~11行的初始化代码适用于block语言,而不是适用于各种要分析的源语言。当利用JavaCC生成SkipOOMiniJOOL语言的分析器时,在生成的分析器类中可能会引入finalprivateJJCalls[]jj_2_rtns成员,这样初始化代码部分就需要增加对jj_2_rtns的初始化,即在第11行后增加for(inti=0;ijj_2_rtns.length;i++)jj_2_rtns[i]=newJJCalls();在实际应用JavaCC生成语言的分析器时,保证在分析器类的doParse()方法中正确加入初始化代码的方法是:查看JavaCC生成的分析器类(假设类名为Parser)中的带参的构造器的体,将其中的代码复制到doParse()方法中的初始化代码处。若分析器只有一个带参的构造器,如Parser(java.io.InputStreamstream),那么就将该构造器体中的代码复制到doParse()方法中;假如分析器有2个带参的构造器,如Parser(java.io.InputStreamstream)和Parser(java.io.InputStreamstream,Stringencoding),那么就将后者的体中的代码复制到doParse()方法中。即便doParse()方法中的初始化代码写得不对,当直接使用分析器类的main()方法进行运行时,仍然可能得到正确的分析结果,而利用实验运行平台进行运行则会出错。这主要是因为,main()方法是调用分析器类的带参的构造器来创建分析器实例,而实验运行平台则是调用分析器类的不带参数的构造器来创建分析器实例,因此需要在分析器类的doParse()方法中正确增加对分析所需的记号管理等变量的初始化操作。2009-6-51.P168,4.6.3节前的最后一段段尾增加如下红色字体的文字:……可以在执行CUP时带上命令行参数“-expectnumber”(表示最多允许number个冲突)以允许冲突的存在。以bin/lab3-2-sblock.xml为例,假设期望最多允许4个冲突,则可以在其中名为java-cup的任务组内的java元素中最后一个arg子元素前增加如下的arg子元素:argvalue=-expect4/光盘部分说明1.若在某系统下,光盘所提供的文本文件中的中文字符显示为乱码,那么请转换该文件的编码格式,使得能正常显示中文。2.student\lib目录下的compiler.jar中提供的SimpleMiniJOOL、SkipOOMiniJOOL和MiniJOOL分析器,不支持警告和错误的检查,只针对正确的源程序才有效。3.student\lib目录下的compiler.jar中提供的AST2LIR转换器只是一个可用的转换器,而不是一个标准甚至是好的转换器。4.student\lib目录下的X86Generator.jar和MIPSGenerator.jar只是一个可用的代码生成器,而不是一个标准甚至是好的代码生成器。a)X86Generator.jar和MIPSGenerator.jar生成的汇编码将boolean型数输出为0或1,而不是实验教程中规定的false或true。本书作者不打算修正这个bug。b)X86Generator.jar生成的汇编码需要在Linux环境下使用。2010-6-17student\lab\lab4目录1.修正bin\build.xml,将第9~11行的propertyname=TOOL_LIBvalue=${TOOL_DIR}/jflex/jflex.jar${TOOL_DIR}/java-cup/java-cup-11a-runtime.jar${TOOL_DIR}/javacc/javacc.jar/改为propertyname=TOOL_LIBvalue=${TOOL_DIR}/java-cup/java-cup-11a-runtime.jar:${TOOL_DIR}/jflex/jflex.jar:${TOOL_DIR}/javacc/javacc.jar/2.修正一些文件中的大小写错误,即将privateASTSymTablesymTable=newBLockSymTable();改成privateASTSymTablesymTable=newBlockSymTable();涉及到的文件包括:config\CUP子目录下的block.cup和block_c.cup、config\JJ子目录下的block.jj和block_c.jj、src\edu\ustc\cs\compile\parser\block\jj子目录下的SParser.java和SCParser.java、src\edu\ustc\cs\compile\parser\block\cp子目录下的SParser.java和SCParser.java。2010-6-12student\lib目录1.更新compiler.jar,主要做如下修改:a)修正原SimpleMiniJOOL、SkipOOMiniJOOL和MiniJOOL分析器不支持带下划线的标识符的bug;test\common目录2.array\InvalidOperation.mja)修改main()函数体,将int[]a1={1,2,3};//ERROR:missthelengthofanarrayint[3]a2={1,2,3};int[3]a3=a2;//ERROR:invalidassignment改为int[2]a1={1,2,3};//ERROR:invalidarraylengthint[3]a2={1,2,a2[0]};//ERROR:invalidarraymemberreferingint[3]a3=a2;//ERROR:invalidassignmentint[3]a4={1,a5[0],a5[1]};//ERROR:invalidarraymemberreferingint[2]a5={1,2};3.array\OutOfBound.mja)修改main()函数体,将循环while(i=10){array[i]=i;}改为while(i=10){array[i]=i;i+=1;}4.string\Invalid.mja)修改main()函数体,将invalud=\123改为invalid=\1235.string\String.mja)修改main()函数体,将escape=\\\\n\r\t\改为escape=\\\\n\r\t,即去掉赋给escape的字符串中结尾的\。test\SkipOOMiniJOOL\correct目录6.allaspect.mja)修改类名,将SynthesisTest改为Allaspectb)删除test0()中对boolean和String型变量的输入测试,即删除如下代码:print(inputfourboolean:\t);booleanb;boolean[2]bArr;read(b);read(bArr[0]);read(sb);read(sbArr[0]);print(\n\tyourinputis:\t);print(b);print(\t);print(bArr[0]);print(\t);print(sb);print(\t);print(sbArr[0]);print(\n);/*工程LIR2MIPS还未实现读入字符串的功能print(inputfourString:\t);Strings;String[2]sArr;read(s);read(sArr[0]);read(ss);read(ssArr[0]);print(\n\tyourinputis:\t);print(s);print(\t);print(sArr[0]);print(\t);print(ss);print(\t);print(ssArr[0]);print(\n);*/c)将函数f44()的定义注释起来,因为这个函数是一个错误的函数,其错误之处在

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功