Java虚拟机的说明书.docx
renewcommandsectionnamePftA1phsectionXrenewcommandXsectionformatflushleft)Xsetcountersection0%newpage%appendix'section语法图beginfigurehtpbXincludegraphicsDiasProgram)caption主程序endfigurebeginfigurehtpbXincludegraphicsDiasConstantsDeclcaption定义常量endfigure)beginfigurehtpbincludegraphicsDias/ConstantDecl)caption定义一个常量endfigurebeginfigurehtpbXincludegraphicsDiasVarsDeclcaption变量定义)endfigure)beginfigurehtpbXincludegraphicsDiasVarsDeclOneType)caption卜一种类型变量定义endfigurebeginfigurehtpbXincludegraphicsDiasVar1.istcaption变量列表endfigure)beginfigurehtpbinc1udegraphicsDiasType)caption类型endfigurebeginfigurehtpbXincludegraphicsDiasProcsDeclcaption过程/函数定义endfigure)beginfigurehtpbincludegraphicsDias/ProcedurcDec1)caption过程定义endfigurebeginfigure)htpbincludegraphicsDias/FunctionDecl)caption函数定义endfigure)beginfigurehtpbXincludegraphics(DiasZStatementBlock)caption语句块endfigurebeginfigurehtpbXincludegraphicsDiasFnctionCallcaption函数调用XincludegraphicsDiasIfStatement)captiontextttif语句endfigure)beginfigurehtpbXincludegraphicsDiasWhiIeStatement)captiontextttwhile语句endfigurebeginfigurehtpbincludegraphicsDiasForStatemcnt)captiontextttfor语句endfigure)beginfigurehtpbXincludegraphicsDiasNewarraycaptiontextttNewarray)语句endfigurebeginfigurehtpbXincludegraphicsDiasRetUrnStatement)captiontextttreturn)语句endfigure)beginfigure)htpbXincludegraphicsDiasSystemCall)caption系统调用endfigure)beginfigure)htpbincludegraphicsDias/Statement)caption语句)endfigure)newpagesection属性翻译文法)先阅读时请参阅用BNF描述的JP1.z语法bcgintabularhtbpccccclhline语法成分&属性&来自&类型&语义动作&位置hline主程序&程序名&标识符&综合&填入全局表&标识符之后Wcline2-6&主代码&语句块&综合&填入全局表&语句块之后hline常量定义)&名称&标识符&综合&填入全局表&识别出字面cline2_4&类型&Type&综合&&量之后cline2-4&值&1.iteral&综合&&hline变量定义&变量数量&一类变量定义&综合&根据是否全局)&全部识别完后W&&相加&&填符号表&OWcline2-4&各变量&一类变量定义&综合&&)W&含类型&&&&Wcline2-4&是否全局&上层结构&继承&&Whline一类变量&变量列表&(Var1.ist)&综合&&(cline(2-4定义&类型&Type&综合&&hline变量列表&变量名列表&标识符&综合&&Whline多个过程&代码&一个过程定义&综合&完成代码&识别出一个&&&&&过程定义之后hline过程定义&名称&标识符&综合&填全局表&识别出右括号后Wcline2-4&参数&前一个变量定义&综合&&Wcline26)&参数个数&前一个变量定义&综合&续填全局表&识别出后一个cline2-4)&本地变量&后一个变量定义&综合&&变量定义之后Wcline2-4&本地变量个数&两个变量定义&综合&&&&变量数量之和&&&cline2-6&代码&语句块&综合&填表&识别出语句块后hline函数定义&名称&标识符&综合&填全局表&识别出类型后Wcline2_4&参数&前一个变量定义&综合&&Wcline2-4&参数个数&前一个变量定义&综合&1&cline(2-4&返回值类型&Type&综合&&cline2-6)&本地变量&后一个变量定义&综合&续填全局表&识别出后一个Wcline2_4&本地变量个数&两个变量定义&综合&&变量定义之后&&变量数量之和&&&Wcline(2-6&代码&语句块&综合&填表&识别出语句块后hline语句块&代码&语句&综合&&hline语句&代码&下层结构&综合&&W&&表达式、子语句&&&W&&textttifwhilefor语句&&&)&&是由它们的子&&&W&&语句拼装起来的。&&&Whline表达式&代码&分析过程&综合&&Whlineendtabular)section错误信息表bcgindescription)itemtextttNeeda在处理赋值时,没有发现':='';)itemtextttTypeConfliCt.某项类型检查没有通过;!itemtextttUsearraywithindex.在赋值语句中,发现数组没有下标;itemtextttIthinkyouwantdeclareaconst,butwhat,sitname?在应当出现常量定义时,没有发现标识符;itemtextttYoushoulduse,=,insteds'.试图用赋值号定义常量;这个错误不会导致跳过;itemtextttYoushoulduse'='.在常量定义中,没有发现等号或赋值号;)itemtextttThisisnotatypei'veeverknown:XXXXXX不是一个类型名称;itcmtextttifthereisno'Idon'tknowwhatyouwanttodo.在常量定义中没有发现冒号;itemtextttifitISaconst,declareitbefore:XXXXXX这个标识符不是预先定义过的常量;)itemtextttIwantaliteral,notaTYPE等号后的不是标识符,也不是字面量;itemtexttt1thinkyourconstantdecishouldbeendhere.常量定义不正确的结束;itemtexttttypenotsame:wantTYPElfound:TYPE2欲定义常量的值与刚才声名的不同,应为TYPEl,实为TYPE2;itemtextttWehaveaNAMEalready.名字冲突;itemtextttXXXisnotaConStand.欲用一个非常量的标识符给常量定义。在约定先定义常量后,这个信息已不可能出现;itemtextttConstsDeclendincorrectly.全部常量定义不正确的结束;itemtextttNeedFilCnamC.(没有在命令行给出欲编译的文件名;itemtextttUnknownargument:XXXXXX不是合法的参数。目前只有textttdebug可以作为合法的参数。itemtextttExpressionfailed.(表达式处理失败。这将导致编译过程中止;)itemtextttArrayindexmuststartWith''在表达式中使用数组而不带下标;)itemtextttIndexmustbeinteger.数组下标不是整数;itemtextttIndexmustbeendWith''下标应以''''结束itemtextttTheremustbeaintegerorfloatexpression.在FOr循环中循环变量应该是整型、初值、终值应该是整型或符点型f。UlOte一般情况下,将符点型表达式赋值给整形变量是不被允许的,但在For语句中符点型的循环初值与终值会自动转换成整型;itemtextttForstatementneedanIntegerVariabIe.循环变量必须是整型'footnote不能是数组元素;itemtextttNotavalidnameofafunction.函数名不合法;将为它指定一个texttt*nothisProCedUre*的名字使分析继续;itemtextttIcannotseea'(,thatcantellmeyouwi11startaparamlist.)itemtextttputa()''eventhereisnoParamter.需要参数列表;JP1.z和'Pascal不同,即使没有参数也要带有左右括号;itemtextttIwanta,),toendyourparalistbutfoundaTYPE没有找到标识参数列表结束的右括号,值找到了TYPE;itemtextttFunctiondeciendincorrectly.函数定义不正确的结束;itemtextttProceduredeciendincorrectly.过程定义不正确的结束;itemtextttIneedareuturntype.函数定义需要返回值类型;itemtextttTheremustbea'beforereturntype.返回值类型前应有'、:'';itemtextttCannotreturnString不能返回"String、类型,字符串都是常量;itemtextttIwantabooleanexpression.(If表达式需要布尔型的条件表达式;itemtextttThenwhat?)找到了''Then'',但'Then''后面没有语句;itemtextttIfStatmcntendincurrectly.If”语句不正确的结束;itemtextttTheremayshouldbeanelse.编译器判定需要有Else''子句;itemtextttTheremustbeaintegerexpressioninindex.Newarray一语句需要一个整型表达式;itemtextttarraynameinvalid.Newarray”语句中数组名非法;itemtextttnewarrayxx:=integer3.中间的符号应该是赋值号;itemtextttXXXNotavalidtype.XXX”不是合法的类型;itemtextttNeeda'.(需要左方括号;itemtextttNeeda''.需要右方括号;itemtextttXXXnotanarray.XXX不是一个数组;)itcmtextttProgrmshouldbeginwithmain.(程序应该以''main''开始;)itemtextttWhat,syourprogram,sname?没有程序名;itemtexttt1.ostSeIniCOlon.丢失分号;itemtextttConstandvarsmustdeclarebeforefuncsandprocs.应该按常量、全局变量、函数/过程的顺序;itemtexttt1thinkthereshouldhaveaBEGINtobeginmainprogram.)S有标识主程序开始的''BEGIN'';itemtextttprocorfuncdeciendincurrectlywithXXX)(全部过程/函数的定义以XXX结束,不正确;itemtextttReturntypeisdifferentfromdeclaraed.返回值类型和定义的不符;itemtextttGivemeareturnVaIUe.函数返回没有返回值;itemtexttt1Don'tknowthisIdentifier:XXX在语句中出现了未定义的标识符;)itemtextttHaveyouforgetthatisaCOnStant?试图给常量赋值;itemtextttStatementstartincorrectly.语句开始不正确;itemtextttStatementendincorrectly.语句以不正确的符号结束;itemtextttUsearraywithindex.赋值中使用数组而不带下标;itemtextttFunctionorproceduremuststartwithbeginnotXXX(必须出现语句块的地方出现了XXX而不是''BEGIN''footnote出现这个错误,编译将终止,否则会出现大量无意义的错误报告。;itemtextttWant,end,toendstatementblock.语句块没有以、END''结束;itemtextttUse:JP1.o.PRINTINT(x).使用系统调用的格式不正确;ilemtextttVarDeclOneTypeEndIncorrectly.一类变量的定义结束不正确;itemtexttt,z,exceptedbutXXXfound.定义变量需要'itemtextttIwantyoutellmethetypebutfoundXXX应该出现类型的位置出现了XXX;itemtextttThereisnoStringvarinjp】O.试图定义字符串变量;itemtextttInvalidVar1.ist)(非法的变量列表;itemtexttt,)for,expectedbut"+Type+"FOUnd.变量列表结束不正确;!itemtextttyouwantdeclareVarsbutidon,tknowhowtostartwithXXX找到了Var关键字,但后续符号不是标识符;itemtextttVarsdeciendincorrectly.变量的定义不正确的结束;itemtextttyourvar,sNameshould*tboXXX变量名非法;itemtextttIwanta'DO'inwhileStatenlent.While语句缺少DO''。itemtextttTypeconflict,or1don;tknowthisSystem-calllikething.不能识别的系统调用,或参数错误。enddescription)XdocumentclassCJK,titlepagecctbookusepackage(CompilerWork)Xincludeonlydescription,design-overview,design-full,proc,test,other,appendix,sourcecode%includeonlydesign-full%includeonlyappendix%includeonlytest%includeonlysourceodebcgindocument)titieUP1.OCProject(编译原理大作业)文档汇编author32060601王楠)XmaketitleXtableofcontentsincludedescription)part设计文档includedesign-overviewincludedesign-ful1includeproc)part源代码说明includesourcecodepart使用操作指南'section操作指南XJP1.zC运行在Java平台上,由于Java的平台无关性,JP1.zC可以在通常使用的Windows和作者开发使用的1.inUX上运行。在使用JP1.zC之前,请确认本机已经安装并配置好了Java的运行时环境。作者使用的是SUn的J2SE5.0,建议读者也安装同样的系统。J2SE5.0的开发和运行时环境可以从texttt(http:/java.sun.Coln上得到。如果读者不会安装和配置Java平台,可以请教身边会安装和配置Java平台的人,或者与作者联系。以下的说明全部以Sun的java平台为准。如果您使用其他的Java平台,请参考您的Java平台的手册。JP1.zC是以一个texttt.jar文件的形式发布的。运行的方法是:beginsourcelist)beginverbatimjava-jarjplOcproject.jarendverbatimendsourcelist)如果不加入任何参数,会得到''需要文件名''的提示,同时会提示使用方法。如果您看到以下错误,请确认您的输入和以上完全一样:beginsourcelist)UnabletoaccessjarfilejplOcprojectendsourcelist您没有给出jar文件的全名,请在jplOcproject后面加上texttt.jar;beginsourcelist)Exceptioninthread"main"java.lang.NoClassDefFoundError:jplOcproject/jarendsourcelist)运行jar文件必须加入-jar参数,请确认。另外如果在1.inux系统上运行,请注意这个系统是大小写敏感的。jplOcproject.jar这几个字母全是小写,第5个字符是数字的、0,'而不是字母的'0,o在后面加入欲编译的文件名即可进行编译。假设欲编译的文件叫full.jpO,在当前目录下,则应输入:beginsourcelistjava-jarjplOcproject.jar./full,jplendsourcelist)如果full.jpl本身没有语法错误,编译中不会产生任何提示。如果您得到''文件找不到'的提示,请确认您的文件名和目录名都是正确的,并且您有足够的权限读取这个文件。如果使用以下命令:bcginsourcelist)java-jarjplOcproject.jar./full,jpl一debugendsourcelist会得到编译过程中的分析报告,但这份报告是为作者调试方便加入的,它的格式没有在本文中说明,作者也不打算说明,如果您看不懂,请不要加入这个选项。如果您使用了除texttt-debug)之外的选项,编译器将报告''未知的选项程序的运行会中止。假设full.jpl的开头是这样的:bcginsourcelist)textttmainpll;ldotsendsourcelist那么在您当前的目录下应该产生了一个P1.Ol.class的文件。请用Is命令或dir命令确认。如果没有,而在刚才的过程中您又没有得到任何提示信息,请与作者联系。注意即使在源程序中main后的程序名含有小写字母,在编译时也会自动将它们转换成大写字母。这个文件是full.JplO编译后的可执行程序。它的运行方法依平台的不同而有细微的差别。在1.irnIX平台上,要运行刚才编译生成的P1.01.class,输入以下指令:beginsourcelisttexttt(java-classpath.:jplOcproject.jarP1.O1)endsourcelist在Windows平台上需要将冒号换成分号:beginsourcelist)textttjava-classpath.JjplOcproject.jarP1.Ol)endsourcelist)请注意欲运行的程序名不可能含有小写字母。如果Java虚拟机报告找不到textttjplOlangProgram)类,请确认jplOcproject.jar位于classpath中。如果您不想在每次运行时加入classpath选项,可以将jplOcproject.jar放入环境变量C1.ASSPATH中,或者您可以将源代码中的Program,java编译后放入某个CIaSSPathjplIang/中。part)测试用例和输出includetest)part评价和感想includeother)part附录includeappendix)enddocument)part项目的描述根据编译原理大作业的要求,结合本人的实际情况,我决定制作这样一个编译系统:beginenumerate)ilem一个扩展的P1./O语言,或称一个精简的PaSCaI语言编译系统;item生成的代码可以在Java平台上执行;item支持整型、符点型、布尔型、字符型,字符串常量、数组;item支持函数声名和函数调用;item可以有带参数的过程、函数调用;)item支持textttfor循环;)item支持textttif_then_else结构;item有一定程度的错点处理能力:itcm使用递归下降子程序进行语法分析;item对表达式使用算符优先分析法;itcm用Java语言实现;item至少可以运行在Sun的Java虚拟机上。item支持方法重载endenumerate)选择Java平台的原因是:这样可以使这个系统具有一定的实用性;以后有可能可以扩充这个语言的语法,或者重写前端以支持将其他语言编译成Java字节码;Java虚拟机本身是一台堆栈计算机,它的汇编代码比较简单,可以直接生成;Java平台有丰富的特性,在JaVa平台上实现可以使语言有良好的可扩展性。选择Java语言的原因是:Java是面向对象的,而编译器的许多部件抽象成对象会比较好处理;使用Java语言处理Java平台的数据类型尤其是符点类型有不可比拟的优势。将这个扩充的P1.O语言命名为JP1.z。将本项目命名为JP1.0CProject(JP1.(TCompiler)。JP1.OCProjet对在Java虚拟机上实现其他语言进行了一次尝试,结果说明:在Java平台上实现其他语言是可行的,但如果语言不是面向对象的。就只能用到Java虚拟机的一小部分特性。因此Java平台上最好使用面向对象的语言。JP1.OCProjeCt的开发周期约为2周,而主要的的开发(语法、语义分析)必须在第一周内完成。这一周是对作者编译原理基础知识、Java语言编程能力、软件工程理论的一次总检验。从结果来看,作者在这几方面还是合格的。但开发过程还是存在一些遗憾:前期开发的几个程序,如词法分析器,作者还有耐心用JaVaDOC添加比较完整的注释,中后期由于发现进度落后,没有心情用注释工具再添加对类、方法的说明,仅在代码内部关键处添加了少量注释。也因为此,整个项目并没有在全部设计结束后才开发,而采用了增量法,希望设计一个类开发一个类。但是由于开发时设计没有全部完成,作者没有能够仔细考虑开发顺序问题,看似顺理成章的从高级的语法结构开始编写,又不愿花时间为每个模块编写专门的测试工具,结果新开发出来的模块无法进行完善的测试,使整个系统隐藏了很多Bug。现在回想起来,应该从最低层的语法结构向上开发,这样不必制作专用的测试工具就可以对比着生成的代码进行测试。经过开学后一周的测试,致命的BUg应该已经消除,大部分正确的程序都能编译通过,但对错误的处理还不是很理想。关键在于在出错的状态下识别一个语法成分结束的算法不是很合理。XJP1.zC的开发过程使作者巩固了编译原理的知识,锻炼了程序开发能力,进行了软件工程的实践,从中收获良多。虽然我们看到JP1.z计划的第一份产品还存在这很多不足,但不能否认这已经是一个具有一定使用价值的产品。作者认为完全有资格参加优秀大作业的评选。part开发过程'section开发计划)'subsection版本1(2月17日)beginitemizeitc112月170:正式立项,完成概要设计、任务计划。)item2月18日:完成词法、语法描述,确保语法是消除了左递归和回溯的。设计符号表、错误处理模块。item2月19日:完成词法分析器。item2月20-24日:完成语法分析、JP1.z平台、代码生成模块。item2月25-26日:综合测试、整理文档。enditemize)'subsection版本2(2月18日)beginitemize)item2月18日:完成文法描述item2月19日:完成词法分析器item2月20-23日:设计符号表,完成语法分析器item(2月24日:完成JP1.z平台item2月25-26日:完成代码生成模块enditemize)'subsection版本3(2月20日)begin(itemize)item2月20-25日并行完成语法分析器、JP1.z平台,要能够产生.class文件。item(2月26日-3月5日调试,整理文档。enditemize)'section实际的开发过程beginitemizeitem2月17日正式立项。己完成的准备工作:浏览了JVUSPCc,对Java虚拟机和其上的指令系统、字节码文件的结构有了一定的了解,在此基础上开发了CIaSSFileAnaIyZer(完全反汇编Java字节码的工具)。itcm2月18日完成概要设计,在设计语法时对概要设计进行了修正调整计划item2月19日完成了词法分析器。item2月20-24日完成了语法分析器,24日夜笫一次生成了.class文件。item2月25日完成了JP1.z平台,生成了可运行的.class文件。item2月26日至今修正多处Bug,制作本文档。enditemize)由于JP1.zC的开发过程很紧张,作者没有仔细规划源代码的结构。又由于Java语言要求将一个类放在一个文件里,过度的面向对象导致源文件过多。在此无法将所有代码全部列出。读者随本文档应该得到一份源代码。如果没有,请与作者联系。如果读者要在自己的机器上编译JP1.zC的源代码,需要预先安装J2SE5.0,或称为JDK1.50这个平台可以从texttthttp"上获得。由于代码使用了J2SE5.0提供的些新特性,在低版本的JDK上无法编译。'section源代码的结构用IS命令得到了以下的文件/目录列表:bcginsourcelist)beginverbatim)attributesincompiledumpperexceptionsgencodesglobalInstructionsusedjpllexersyntaxtablesteststokens.Zattributesincompile:Code,javaVar1.istWithType.java./dmpper:CreateClassFile.java./exceptions:CompiIeCannotContinue.javaExpressionFail.javaPhraserError.javaTypeConflict.java./gencodes:CodeGener.java./global:ArraySet.javaCONSTANT_POO1._NODE_TYPE.javaFollows,javaPriorityTable.javaTAB1.E_NODE_K1NDS.javaTAB1.E_NODE_TYPES.javaTOKEN_TYPES.javautil,java./instructionsused:1.OAD.javaASTORE.javaBIPUSH.javaDUP.javaF2I.javaFADD.javaFA1.OAD.javaFSTORE.javaFCMPG.javaFCMP1.javaFDIV.javaF1.OAD.javaFMU1.javaFREM.javaFRETURN.javaFSTORE.javaFSUB.javaGetstatic.javaGOTO.javaI2F.javaIADD.javaIA1.OAD.javaIAND.javaIASTORE.java!CONST.javaIDIV.javaIFEQ.javaIFGE.javaIFGT.javaIFCMPGE.javaIF_ICMPGT.javaIF_ICMP1.E.javaIFCMP1.T.javaIFCMPNE.javaIF1.E.javaIF1.T.javaIFNE.java!1.OAD.javaIMU1.javaInstruction,javaInvokestatic.javaI0R.javaIREM.java!RETURN.java!STORE.javaISUB.javaIXOR.java1.DC_W.javaNewarray.javaNOP.javaPOP.javaPRINTBOO1.EAN.javaPRINTCHAR,javaPRINTF1.OAT.javaPRINTINT.javaPRINTSTRING.javaPutstatic.javaRETURN.javaSIPUSH.javaSWAP,java.jpl:lang.jpllang:Program,java./lexer:JP1.O1.exer.java./syntax:AssignToVar.javaConstantDecl.javaConstsDecl.javaExecutor,javaExpression,javaForStatement.javaFunctionCall.javaFunctionDecl.javaIfStatement.javaNewarray.javaPhraser,javaProcedureDecl.javaProcsDecl.javaReturnStatement.javaStatementBlock.javaStatement,javaSyntax,javaSystemCall.javaVarDeclOneType.javaVar1.ist.javaVarsDecl.javaWhileStatement.java./tables:CompileTimeCP.javaCompileTimeCPNode.javaConstantNode.javaFunctionNode.javaGlobalTable.javaGlobalTableNode.java