下载此文档

附录A 一个完成的编译器前端程序.doc


文档分类:IT计算机 | 页数:约10页 举报非法文档有奖
1/10
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/10 下载此文档
文档列表 文档介绍
附录A 一个完成的编译器前端程序
这个附录给出了一个完整的编译器前端程序,-。。我们首先给出源语言的语法。描述这个语法所用的文法需要进行调整,以适应自顶向下的语法分析技术。
这个翻译器的Java代码由五个包组成:main、lexer、symbol、parser和inter。包inter中包含的类处理用抽象语法表示的语言结构。因为语法分析器的代码和其它各个包交互,它将在最后描述。每个包被存放在一个独立的目录中,每个类都有一个单独的文件。
作为语法分析器的输入时,源程序就是一个由词法单元组成的流,因此面向对象特性和语法分析器的代码之间没有什么关系。当由语法分析器输出时,源程序就是一棵抽象语法树,树中的结构或结点被实现为对象。这些对象负责处理下列所有的事情:构造一个抽象语法树结点,类型检查,生成三地址中间代码(见包inter)。

这个语言的一个程序由一个块组成,该块中包含了可选的声明和语句。记号basic表示基本类型。
(见原文)
把赋值当作一个语句,而不是表达式中的运算,进行处理可以简化翻译工作。
面向对象与面向步骤
在一个面向对象方法中,一个构造的所有代码都集中在这个构造对应的类中。但是在面向步骤的方法中就不一样,这个方法中的代码是按照步骤进行组织的,因此一个类型检查子过程中对每个构造都有一个case分支,且一个代码生成子过程对每个构造也都有一个case分支,等等。
这两者的折中之处在于:使用面向对象方法会使得改变或增加一个构造,比如“for”语句,变得较容易;而使用面向步骤的方法会使得改变或增加一个步骤,比如类型检查,变得比较容易。使用对象来实现时,增加一个新的构造可以通过写一个自包含的类来实现,但是如果要改变一个步骤,比如插入类型强制转换的代码,就需要改变所有受影响的类。使用面向步骤的方式时,增加一个新构造可能会引起各个步骤中的多个过程的改变。
(见原文)
表达式的产生式处理了运算符的结合率和优先级。它们对每个优先级级别都使用了一个非终结符号,而非终结符号factor被用来表示括号中的表达式、标识符、数组引用和常量。
(见原文)
Main
程序的执行从类Main的例程main中开始。例程main创建了一个词法分析器和一个语法分析器,然后调用语法分析器中的例程program。
(见原文)
词法分析器
。类Tag定义了各个词法单元对应的常量:
(见原文)
其中的三个常量,INDEX、MINUS和TEMP不是词法单元;它们将在抽象语法树中使用。
,但是增加了例程toString:
(见原文)
类Word用于管理保留字,标识符,和象&&这样的复合词法单元的词素。它也可以被用来管理在中间代码中运算符的写法;比如单目减号,源文本中的-2的中间形式是minus 2。
(见原文)
类Real用于处理浮点数:
(见原文)
,类Lexer的主例程,即函数scan,识别数字、标识符和保留字。
类Lexer中的第9到13行保留了选定的关键字

附录A 一个完成的编译器前端程序 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数10
  • 收藏数0 收藏
  • 顶次数0
  • 上传人840122949
  • 文件大小67 KB
  • 时间2018-11-09