第3,4次课 一个简单的语法制导翻译器 2.3~2.5.

Slides:



Advertisements
Similar presentations
平面构成 第六章 平面构成形式与法则 — 破规与变异. 第七章 平面构成形式与法则 — 破规与变异 破规与变异构成的形式、有下列四类: 一、特异构成 特异构成。其表现特征是,在普遍相同性质的事物 当中,有个别异质性的事物,便会立即显现出来。
Advertisements

我征服了黃山 林達的黃山之旅 2006春.
任课老师:戴新宇 助教: 实验一 词法分析和语法分析 任课老师:戴新宇 助教: 2014年3月20日.
编 译 原 理 指导教师:杨建国 二零一零年三月.
《高等数学》(理学) 常数项级数的概念 袁安锋
编 译 原 理 指导教师:杨建国 二零一零年三月.
第 5 章 流程控制 (一): 條件分支.
全国计算机等级考试 二级基础知识 第二章 程序设计基础.
第三章 控制结构.
编译原理与技术 --文法和分析 2018/9/17 《编译原理与技术》讲义.
第四章 语法分析 赵建华 南京大学计算机系
第三章 语法分析 本章内容 上下文无关文法 自上而下分析和自下而上分析 围绕分析器的自动生成展开 词 法 分析器 记 号 取下一个记号
编译原理与技术 第3章 语法分析 14学时.
第七章 中间代码生成 静态 中间 分析 检查 代码 记号流 器 生成 本章内容 介绍几种常用的中间表示:后缀表示、图形表示和三地址代码
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
编译原理习题
自上而下分析 4.4.
自上而下分析 4.4.
EBNF 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
宁波镇海蛟川书院 卢啸尘 ID: Ruchiose
第六章 属性文法和语法制导翻译 网上教学系统: : 编译原理
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
第四章 语法制导的翻译 本章内容 1、介绍语义描述的一种形式方法:语法制导的翻译,它包括两种具体形式 语法制导的定义 翻译方案
第四章 语法分析.
第三章 词法分析.
走进编程 程序的顺序结构(二).
元素替换法 ——行列式按行(列)展开(推论)
第2次课 上下文无关文法
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
语义分析简介 编译程序的目标:将源程序翻译成为语义等价的目标程序。 语义分析的主流技术:
LL(1)分析方法 LL(1)是LL(k)的特例,其中的k则表示向前看k个符号. LL(1)方法和递归下降法属于同一级别的自顶向下分析法.
第六、七章属性文法、语法制导翻译和中间代码
第八章语法制导翻译和中间代码生成 8.1概述 8.2属性文法和语法制导翻译 8.3语义分析 8.4中间代码 8.5一些语句的翻译.
编译原理与技术 语法制导翻译 2019/1/17 《编译原理与技术》讲义.
李元金 计算机与信息工程学院 第9讲 语法分析—自上而下分析(1) 李元金 计算机与信息工程学院
第二章 Java语言基础.
语法制导的翻译 (Syntax-Directed Translation)
《编译原理与技术》 期末复习 计算机科学与技术学院 郑启龙 李 诚 25/12/2018.
第三章 语法分析 自顶向下语法分析思想 语法分析方法的分类: 自顶向下语法分析方法(Top-Down) ,亦称面向目标的分析方法;
陳維魁 博士 儒林圖書公司 第五章 控制結構 陳維魁 博士 儒林圖書公司.
SOA – Experiment 2: Query Classification Web Service
第4章 PHP流程控制语句.
解决变化问题的自底向上 流程建模方法 严志民 徐玮.
编译原理与技术 第4章 语法制导的翻译 6学时.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
C# 入门 2011级ACM班 张方魁.
编译原理总结-1 第3~5章.
编译原理实践 13.语法分析程序的自动生成工具YACC.
文法等价变换 文法的等价 对文法G1和G2,若有:L(G1)=L(G2),则称文法G1和G2等价, 记作:G1=G2. 文法等价变换
复习.
自底向上的语法分析 4.5.
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
美麗的西子湖.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第九节 赋值运算符和赋值表达式.
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
编译原理与技术 -- 自顶向下分析 2019/5/5 《编译原理与技术》讲义.
3.16 枚举算法及其程序实现 ——数组的作用.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第七、八次实验要求.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
第二章 Java基本语法 讲师:复凡.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
多重條件選擇敘述
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
编译原理实践 6.程序设计语言PL/0.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
Presentation transcript:

第3,4次课 一个简单的语法制导翻译器 2.3~2.5

中缀表达式转后缀表达式 本次课主要内容都是基于如何将中缀表达式转换为后缀表达式 9 – 5 + 2 -> 95-2+

2.3语法制导翻译的定义

第二章 一个简单的语法制导翻译器 语法制导翻译:对语法树进行语义分析 例如:将中缀表达式转化成为后缀 9 - 5 + 2  9 5 – 2 +  ? list digit 9 - 5 + 2

第二章 一个简单的语法制导翻译器 语法制导翻译:对语法树进行语义分析 语法制导定义 语法制导翻译方案

第二章 一个简单的语法制导翻译器 语法制导翻译 语法制导定义(syntax-directed definition) expr.t = 95-2+ 语法制导翻译 语法制导定义(syntax-directed definition) 每个文法符号和一个属性集合相关联 例树中”.t”是属性 每个产生式和一组语义规则相关联 例子:9-5+2 expr.t = 95- + term.t = 2 expr.t = 9 - term.t = 5 2 term.t = 9 5 9 产生式 语义规则 expr  expr1 + term expr.t = expr1.t || term.t || ‘+’ expr  expr1 - term expr.t = expr1.t || term.t || ‘-’ expr  term expr.t = term.t term  0 term.t = ‘0’ term  1 term.t = ‘1’ … term  9 term.t = ‘9’

第二章 一个简单的语法制导翻译器 语法制导翻译 属性 综合属性 继承属性 如果某个属性在语法分析树节点N上的值由N的子节点和N本身的属性值确定,则该属性为综合属性 继承属性 如果某个属性由语法分析树中该节点本身、父节点以及兄弟节点上的属性值决定,则该属性为继承属性

后缀表达式(postfix notation):E 第二章 一个简单的语法制导翻译器 后缀表达式(postfix notation):E 如何E是一个变量或常量,则E的后缀是本身 如果E是一个形如E1 op E2的表达式,op是二目运算符,那么E的后缀表示是:E1’ E2’ op,这里E1’ 和E2’分别是E1和E2的后缀表示 如果E是一个形如(E1)的表达式,则E的后缀表示就是E1的后缀表示

第二章 一个简单的语法制导翻译器 语法制导翻译 语法制导定义(syntax-directed definition) expr.t = 95-2+ 语法制导翻译 语法制导定义(syntax-directed definition) 每个文法符号和一个属性集合相关联 例树中”.t”是属性 每个产生式和一组语义规则相关联 expr.t = 95- + term.t = 2 expr.t = 9 - term.t = 5 2 term.t = 9 5 9 后缀表达式 产生式 语义规则 expr  expr1 + term expr.t = expr1.t || term.t || ‘+’ expr  expr1 - term expr.t = expr1.t || term.t || ‘-’ expr  term expr.t = term.t term  0 term.t = ‘0’ term  1 term.t = ‘1’ … term  9 term.t = ‘9’

第二章 一个简单的语法制导翻译器 语法制导翻译 语法制导定义(syntax-directed definition) expr.t = 95-2+ 语法制导翻译 语法制导定义(syntax-directed definition) 每个文法符号和一个属性集合相关联 例树中”.t”是属性 每个产生式和一组语义规则相关联 expr.t = 95- + term.t = 2 expr.t = 9 - term.t = 5 2 term.t = 9 5 9 产生式 语义规则 expr  expr1 + term expr.t = expr1.t || term.t || ‘+’ expr  expr1 - term expr.t = expr1.t || term.t || ‘-’ expr  term expr.t = term.t term  0 term.t = ‘0’ term  1 term.t = ‘1’ … term  9 term.t = ‘9’ 简单语法制导定义

第二章 一个简单的语法制导翻译器 语法制导翻译 语法制导定义(syntax-directed definition) 深度优先遍历 expr.t = 95-2+ 语法制导翻译 语法制导定义(syntax-directed definition) 深度优先遍历 expr.t = 95- + term.t = 2 expr.t = 9 - term.t = 5 2 term.t = 9 5 9 产生式 语义规则 expr  expr1 + term expr.t = expr1.t || term.t || ‘+’ expr  expr1 - term expr.t = expr1.t || term.t || ‘-’ expr  term expr.t = term.t term  0 term.t = ‘0’ term  1 term.t = ‘1’ … term  9 term.t = ‘9’ procedure visit ( node N) { for(从左到右遍历N的每个子节点C) { visit(C); } 按照节点N上的语义规则求值; 深度优先,自底向上,综合属性

第二章 一个简单的语法制导翻译器 语法制导翻译:对语法树进行语义分析 语法制导定义 语法制导翻译方案 将程序片段附加到一个文法的各个产生式上的表示法 rest  + term { print ( ‘ + ‘ ) } rest1

第二章 一个简单的语法制导翻译器 语法制导翻译:对语法树进行语义分析 语法制导定义 语法制导翻译方案 将程序片段附加到一个文法的各个产生式上的表示法 被嵌入到产生式体中的程序片段成为语义动作(semantic action)。语义动作用花括号括起来。 rest  + term { print ( ‘ + ‘ ) } rest1 rest + term {print(‘+’)} rest1

第二章 一个简单的语法制导翻译器 语法制导翻译:对语法树进行语义分析 语法制导定义 语法制导翻译方案 将程序片段附加到一个文法的各个产生式上的表示法 如何E是一个变量或常量,则E的后缀是本身 如果E是一个形如E1 op E2的表达式,op是二目运算符,那么E的后缀表示是:E1’ E2’ op,这里E1’ 和E2’分别是E1和E2的后缀表示 如果E是一个形如(E1)的表达式,则E的后缀表示就是E1的后缀表示 ( 9 – 5 ) + 2  9 5 – 2 + ?    9 5 2 + - 3 *

第二章 一个简单的语法制导翻译器 语法制导翻译:对语法树进行语义分析 语法制导定义 语法制导翻译方案 expr expr + term {print(‘+’)} expr - term {print(‘-’)} 2 {print(‘2’)} term 5 {print(‘5’)} 9 {print(‘9’)} 翻译方案 expr  expr1 + term {print(‘+’)} expr  expr1 – term {print(‘-’)} expr  term term  0 {print(‘0’)} term  1 {print(‘1’)} … term  9 {print(‘9’)}

总结 语法制导的定义 后缀表达式 语法制导的翻译方案

2.4语法分析

第二章 一个简单的语法制导翻译器 语法分析 决定如何使用一个文法生成一个终结符号串的过程 给定输入: 输出:? 终结符号串:9  –  5  + 2 文法: list  list + digit list  list - digit list  digit digit  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 输出:?

第二章 一个简单的语法制导翻译器 语法分析 决定如何使用一个文法生成一个终结符号串的过程 给定输入: 输出:? 终结符号串:9  –  5  + 2 文法: list  list + digit list  list - digit list  digit digit  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 输出:? list digit 9 - 5 + 2

第二章 一个简单的语法制导翻译器 语法分析 决定如何使用一个文法生成一个终结符号串的过程 上下文无关文法 通常Parsing的时间复杂度是O(n3) 对于程序设计语言,时间复杂度是O(n) 自顶向下方法 自底向上方法

第二章 一个简单的语法制导翻译器 语法分析 自顶向下分析方法 例:给定文法: stmt  expr | if ( expr ) stmt | for ( optexpr ; optexpr ; optexpr ) stmt | other optexpr  ε | expr

第二章 一个简单的语法制导翻译器 语法分析 自顶向下分析方法 stmt  expr | if ( expr ) stmt | for ( optexpr ; optexpr ; optexpr ) stmt | other optexpr  ε | expr 输入是:for ( ; expr ; expr ) other

第二章 一个简单的语法制导翻译器 语法分析 自顶向下分析方法 stmt  expr ; | if ( expr ) stmt | for ( optexpr ; optexpr ; optexpr ) stmt | other optexpr  ε | expr 输入是:for ( ; expr ; expr ) other stmt for ( optexpr ; optexpr ; optexpr ) stmt ε expr expr other

stmt 语法 分析树 other 输入 for ( ; expr ; expr )

stmt 语法 分析树 other 输入 for ( ; expr ; expr ) 语法 分析树 other for ( ; expr ; optexpr ; optexpr ; optexpr ) stmt other for ( ; expr ; expr ) 输入 stmt

stmt 语法 分析树 other 输入 for ( ; expr ; expr ) 语法 分析树 other for ( ; expr ; optexpr ; optexpr ; optexpr ) stmt other for ( ; expr ; expr ) 输入 stmt 语法 分析树 for ( optexpr ; optexpr ; optexpr ) stmt other for ( ; expr ; expr ) 输入

第二章 一个简单的语法制导翻译器 语法分析 自顶向下分析方法 一般来说,为一个非终结符号选择产生式是一个“尝试并犯错”的过程 —— 回溯 预测语法分析法:不需要回溯 要求设计的文法满足:当考虑到一个输入符号(终结符)的时候,只有一种非终结符可以生成这个输入符号,是确定性的。 FIRST集合 令α是一个文法符号(终结符号或非终结符号)串, FIRST(α)是由α生成的一个或多个终结符号串的第一个符号的集合。 如果α是ε或者可以生成ε ,那么ε也在FIRST(α)中

第二章 一个简单的语法制导翻译器 语法分析 自顶向下分析方法 一般来说,为一个非终结符号选择产生式是一个“尝试并犯错”的过程 —— 回溯 预测语法分析法:不需要回溯 要求设计的文法满足:当考虑到一个输入符号(终结符)的时候,只有一种非终结符可以生成这个输入符号,是确定性的。 有两个产生式A  α和Aβ,预测分析法要求FIRST(α)和FIRST(β)不相交 如果输入符号在FIRST(α)中,就用A  α,如果输入符号在FIRST(β)中,就用A  β

第二章 一个简单的语法制导翻译器 语法分析 自顶向下分析方法 预测分析法 stmt  expr ; | if ( expr ) stmt | for ( optexpr ; optexpr ; optexpr ) stmt | other optexpr  ε | expr FIRST(stmt) = {expr, if, for, other} FIRST(expr ;) = { expr }

match(expr); match(‘;’); break; case if: void stmt() { switch(lookahead) { case expr: match(expr); match(‘;’); break; case if: match(if); match(‘(’); match(expr); match(‘)’); stmt(); break; case for: match(for); match(‘(’); optexpr(); match(‘;’); optexpr(); match(‘;’); optexpr(); match(‘)’); stmt(); break; case other: match(other); break; default: report(“syntax error”); } stmt  expr | if ( expr ) stmt | for ( optexpr ; optexpr ; optexpr ) stmt | other

第二章 一个简单的语法制导翻译器 void optexpr() { if(lookahead == expr) match(expr); } void match(terminal t) { if(lookahead == t) lookahead = nextTerminal; else report(“syntax error”); }

第二章 一个简单的语法制导翻译器 void optexpr() { if(lookahead == expr) match(expr); } 何时使用ε产生式 输入:for ( ; expr ; expr ) other void match(terminal t) { if(lookahead == t) lookahead = nextTerminal; else report(“syntax error”); }

第二章 一个简单的语法制导翻译器 设计一个预测分析器 嵌入翻译方案 对应于非终结符A: 翻译动作作为一个非终结符 检查向前看符号,决定使用A的哪个产生式。如果一个产生式的体为α(α不是空串ε),且向前看符号在FIRST(α)中,那么就选择这个产生式。 然后,模拟被选中的产生式的体,也就是,从左向右逐个执行此产生式体的符号。“执行”就是调用相应非终结符的过程。 嵌入翻译方案 翻译动作作为一个非终结符

第二章 一个简单的语法制导翻译器 语法分析 左递归 可能使递归下降语法分析器进入无限循环 例: expr  expr + term | term expr expr term expr term … expr term …

第二章 一个简单的语法制导翻译器 语法分析 消除左递归 A  A α | β A  β R R  α R | ε A … A A A .,. R R β α … Ɛ

左递归 消除左递归,并构建语法树 9-5+2 A  A α | β A  β R R  α R | ε expr expr +term | term expr expr -term | term

2.5简单表达式的翻译器

第二章 一个简单的语法制导翻译器 实现一个简单表达式的翻译器 中缀表达式 翻译成 后缀表达式 翻译方案 中缀表达式 翻译成 后缀表达式 翻译方案 expr  expr1 + term {print(‘+’)} expr  expr1 – term {print(‘-’)} expr  term term  0 {print(‘0’)} term  1 {print(‘1’)} … term  9 {print(‘9’)}

第二章 一个简单的语法制导翻译器 实现一个简单表达式的翻译器 中缀表达式 翻译成 后缀表达式 消除左递归的翻译方案: A  γR 中缀表达式 翻译成 后缀表达式 消除左递归的翻译方案: 消除左递归 A  γR R  αR | βR | ε A  Aα | Aβ | γ

第二章 一个简单的语法制导翻译器 实现一个简单表达式的翻译器 中缀表达式 翻译成 后缀表达式 消除左递归的翻译方案: 中缀表达式 翻译成 后缀表达式 消除左递归的翻译方案: expr  expr + term {print(‘+’)} | expr - term {print(‘-’)} | term term  0 {print(‘0’)} | 1 {print(‘1’)} … | 9 {print(‘9’)} expr  term rest rest  + term {print(‘+’)} rest | - term {print(‘- ’)} rest | ε term  0 {print(‘0’)} | 1 {print(‘1’)} … | 9 {print(‘9’)} 消除左递归

第二章 一个简单的语法制导翻译器 实现一个简单表达式的翻译器 中缀表达式 翻译成 后缀表达式 翻译过程图解: 9 {print(‘9’)} 中缀表达式 翻译成 后缀表达式 翻译过程图解: expr  term rest rest  + term {print(‘+’)} rest | - term {print(‘- ’)} rest | ε term  0 {print(‘0’)} | 1 {print(‘1’)} … | 9 {print(‘9’)} expr term rest 9 {print(‘9’)} - term {print(‘-’)} rest 5 {print(‘5’)} + term {print(‘+’)} rest ε 2 {print(‘2’)}

第二章 一个简单的语法制导翻译器 实现一个简单表达式的翻译器 中缀表达式 翻译成 后缀表达式 非终结符的过程 中缀表达式 翻译成 后缀表达式 非终结符的过程 expr  term rest void expr() { term(); rest() }

第二章 一个简单的语法制导翻译器 实现一个简单表达式的翻译器 中缀表达式 翻译成 后缀表达式 非终结符的过程 中缀表达式 翻译成 后缀表达式 非终结符的过程 rest  + term {print(‘+’)} rest | - term {print(‘- ’)} rest | ε void rest () { if( lookahead == ‘+’) { match(‘+’); term(); print(‘+’); rest(); } else if( lookahead == ‘-’) { match(‘-’); term(); print(‘-’); rest(); else { } /*不对输入作任何处理*/

第二章 一个简单的语法制导翻译器 实现一个简单表达式的翻译器 中缀表达式 翻译成 后缀表达式 非终结符的过程 中缀表达式 翻译成 后缀表达式 非终结符的过程 term  0 {print(‘0’)} | 1 {print(‘1’)} … | 9 {print(‘9’)} void term() { if( lookahead是一个数位) { t = lookahead; match(lookahead); print(t); } else {report(“语法错误”);}

第二章 一个简单的语法制导翻译器 实现一个简单表达式的翻译器 中缀表达式 翻译成 后缀表达式 翻译器的简化 void rest () { 中缀表达式 翻译成 后缀表达式 翻译器的简化 void rest () { if( lookahead == ‘+’) { match(‘+’); term(); print(‘+’); rest(); } else if( lookahead == ‘-’) { match(‘-’); term(); print(‘-’); rest(); else { } /*不对输入作任何处理*/

第二章 一个简单的语法制导翻译器 实现一个简单表达式的翻译器 中缀表达式 翻译成 后缀表达式 翻译器的简化 void rest () { 中缀表达式 翻译成 后缀表达式 翻译器的简化 void rest () { while(true) { if( lookahead == ‘+’) { match(‘+’); term(); print(‘+’); continue; } else if( lookahead == ‘-’) { match(‘-’); term(); print(‘-’); continue; break;

重点 语法制导定义 语法制导翻译方案 中缀表达式转后缀表达式 深度优先遍历语法树 自顶向下分析的语法分析 FIRST集合 消除左递归 个简单的语法制导翻译器的实现

作业 给定以下语句,清除空行,注释,提取变量名,变量和数值 用C++/Python实现,仅限于下文中的情况 int a; int b; a = 2; // comment 1 b = a + 12; /* comment 2 */