网站大量收购闲置独家精品文档,联系QQ:2885784924

第二章 简单的一遍编译器.ppt

  1. 1、本文档共71页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 简单的一遍编译器

第二章 简单的一遍翻译器 A Simple One Pass Compiler 本章主要内容 开发一个把中缀表达式转换为后缀表达式的翻译程序,展示基本的编译技术 主要描述编译器的前端 词法分析、语法分析和语义分析 通过本章对编译器构造的过程有所了解 2.1 概述 程序设计语言由语法(syntax)和语义(semantics)两个方面定义。 语法描述程序的正确形式 语义则描述程序的含义 语义的描述比语法的描述难得多 如何描述语法 Bakus-Naur范式(BNF) Syntax Graph 上下文无关文法 (CFG, Context Free Grammar ) Backus-Naur范式(BNF) Examples of BNF Syntax Graph 2.2 语法定义 语法描述程序设计语言的层次结构,如C语言的条件语句形如: if (expression) statement else statement 或者 if (expression) statement 这一规则表示为: if_stmt ? if (expr) stmt else stmt if_stmt ? if (expr) stmt 描述规则称为产生式 (production) 用上下文无关文法 (Context-free Grammar, CFG)来形式化这种描述。 2.2.1 上下文无关文法 上下文无关文法CFG是一个四元组 (Vt, Vn, S, P),其中: Vt 是一个非空有穷集合,称作终结符号集合Terminal Symbols Vn 是一个非空有穷集合,称作非终结符号集合Non-terminals ,且Vt?Vn = ?。 S ? Vn ,称作开始符号Start Symbol 。 P是一个非空有穷集合,称为产生式集合Production Rules ,每条产生式形为A??,其中A?Vn,??(Vt?Vn)*。 例2.1 简单的算术表达式 例2.1 简单的算术表达式 2.2.2 推导(derive) 例2.3 函数调用中的参数列表 2.2.3 分析树(Parse Tree) 分析树描述如何从文法的开始符号推导出它的语言中的一个语句。 如果非终结符A有产生式 A ?XYZ,则A的一棵分析树为: Parse Tree 分析树具有如下性质: Root is labeled with the Start Symbol Leaf node is a token or ? Interior node (Non-leaf) is a Non-Terminal If A ? x1x2…xn, Then A is an interior; x1x2…xn are children of A and may be non-terminals or tokens 一个文法生成的语言是它的某个分析树生成的串的集合。为给定的符号串找到一棵分析树的过程称为串的语法分析(parsing)。 推导过程可以用分析树( Parse Tree )表示 2.2.4 二义性 Ambiguity 如何判断文法具有二义性? 如果文法的某个句子存在两棵分析树, 则该句子是二义性的 。 如果一文法包含二义性的句子,则这个文法是二义性的。 句子abab有两个不同的最左推导,该句子是二义性的 ,所以此文法是二义性的。 2.2.5 Associativity of Operators 可以用括号来表明计算顺序,如 9-5+2 = (9-5)+2 如果对某个运算符op,x1,x2,x3为运算对象,且x1 op x2 op x3 表示 (x1 op x2) op x3,则称op是左结合的;如果x1 op x2 op x3 表示 x1 op (x2 op x3),则称op是右结合的。 Left vs. Right Question 如何增加*、/运算符? 2.2.6 Operator Precedence What does 9 + 5 * 2 mean? 2.2.6 Operator Precedence What does 9 + 5 * 2 mean? (9 + 2) * 5 9 + (5 * 2) 不同的运算符号有不同的优先级,如9+5*2 表示 9+(5*2),所以*的优先级比+高。 通过适当改写文法规则,可以描述不同的结合律和优先级: 基本因子: factor ? digit | ( expr ) 项由因子进行乘除运算构成: term ? term * factor | term / fa

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档