编译原理实践 11.语义分析与代码生成.

Slides:



Advertisements
Similar presentations
第二单元 生产、劳动与经营 第五课 企业与劳动者. 想创办企业,开一家公司,公司和企业是一回事吗? 是以营利为目的而从事生产经营活动, 向社会提供商品或服务的 经济组织 依法设立的,有独立的法人财产、以营 利为目的的企业法人。企业法人 创办的公司可以采用任何形式吗? 我国法定的公司形式: 有限责任公司和股份有限公司.
Advertisements

天水圍的體育設施.
证券市场基础知识真题.
二代健保重點說明.
C语言程序设计 主讲教师 :张群燕 电话:
性理釋疑(1—30題) 後學 阮章輝 學講.
第一章 C语言概述 计算机公共教学部.
孔子傳第三集: 興辦私學-禮學之美 生命教育工作坊.
教师队伍 冷传莉 课程负责人 冷传莉,女,1969年8月生,汉族,山东省蓬莱人,中共党员,教授,贵州大学法学院副院长,硕士生导师,武汉大学法学院民商法博士研究生。 兼任贵州大学民法经济法研究所所长,中国法学会民法学、商法学研究会全国理事,贵州省人民政府行政复议委员会委员,贵州省社科院法学研究所和贵州省社科院民商法研究中心特聘法学研究员,贵州省企业法制研究院副院长,贵阳市人民政府法律顾问,贵阳仲裁研究会副会长,贵阳仲裁委员会资深仲裁员,贵阳法制频道法律顾问。
新世代計算機概論 第14章 程式語言.
浙江省温州苍南第二高级中学 教师:王志国.
程式設計實作.
第八章 符号表 符号表的作用: 一致性检查和作用域分析; 辅助代码生成..
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
Class 2 流程控制-選擇敘述與迴圈.
第二章 C# 基础知识.
C++Primer 3rd edition 中文版 Chap 5
编译原理与技术 第7章 中间代码生成 3学时.
C++程序设计 第二讲 清华大学软件学院.
C++中switch语句的BNF 否极泰来 ——《周易》.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
第5章 语义分析(Semantic Analysis)
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
6 下标变量的中间代码生成 下标:数组;变量: 下标变量:即数组分量: 简单变量:id,其地址可查到;
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第三章 C++中的C 面向对象程序设计(C++).
编译原理课程设计.
條件判斷指令 -if 指令 -switch 指令 迴圈指令 - for 迴圈 - while迴圈 - break、continue 指令
编译原理实践 5.给定语法的语法分析程序构造.
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
Java程序设计 第2章 基本数据类型及操作.
第2章 PL/0编译程序 2.1 PL/0语言和类pcode的描述 2.2 PL/0编译程序的结构 2.3 PL/0编译程序的语法语义分析
編譯程式設計 期末專題說明 V1.1 May 2004.
第三章 C# 基础知识.
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
C++程序语言设计 Chapter 3: The C in C++.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第二章 词法分析4 词法分析程序实现 构造词法分析器步骤 单词的形式化描述 词法分析程序的实现.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第六章 语法制导的翻译 本章内容 介绍一种语义描述方法:语法制导的翻译,介绍语法制导的翻译的实现方法。
陳維魁 博士 儒林圖書公司 第三章 變數與繫結 陳維魁 博士 儒林圖書公司.
保留字與識別字.
開放電腦計劃 報告人:陳鍾誠 2011 年 8 月 20 日 台灣開源人年會 COSCUP 2011 – 中研院
第3章 JavaScript基本语句.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
习题课 编译原理与技术 计算机科学与技术学院 李诚.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
第九章 运行时存储空间组织 网上教学系统: : 编译原理
编译原理课程设计 课程设计内容 扩展PL/0语言的实现(含编译器和解释器)  编译器:把源程序翻译成中间语言程序
4.4整式.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
计算机问题求解 – 论题 基本的数据结构 2018年05月09日.
第6章 PHP基本語法介紹.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
C语言基本语句 判断循环.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
编译原理实践 7.PL/0的词法分析程序构造.
编译原理实践 6.程序设计语言PL/0.
Presentation transcript:

编译原理实践 11.语义分析与代码生成

table数组和enter过程的扩充 命令代码生成过程gen 表达式、项、因子及关系式的翻译 语句的翻译 生成PL/0目标代码程序

1. table数组和enter过程的扩充 lod l,a 将l,a形成的栈地址变量值置入栈顶 sto l,a 将栈顶值保存到l,a形成的栈地址变量 l level级别之差 变量所处的程序段静态级别与 变量被说明时的静态级别之差 a offset

必须将variable和procedure的level保存在合适的 地方 cal l,a 调用子程序 l level级别之差 call语句所处的程序段静态级别与 调用过程被说明时的静态级别之差 a 被调用代码程序段的起始地址 必须将variable和procedure的level保存在合适的 地方

改变符号表 struct tablestruct { char name[al]; /* 名字 */ enum object kind; /* 类型:constant,variable或 procedure */ int val; /* 数值,仅const使用 */ int level; /* 所处层,仅const不使用 */ int adr; /* 地址,仅const不使用 */ int size; /* 需要分配的数据区空间, 仅procedure使用 */ }; 常量:val 变量:静态级别,位移地址 过程:程序地址,静态级别,预留存储单元

void enter(enum object k, int. ptx, int lev, int. pdx) { ( void enter(enum object k, int* ptx, int lev, int* pdx) { (*ptx)++; strcpy(table[(*ptx)].name, id); /*符号表的name域记录标识符的名字*/ table[(*ptx)].kind = k; switch (k) case constant: /* 常量 */ if (num > amax) error(31); /* 常数越界 */ num = 0; } table[(*ptx)].val = num; /* 登记常数的值 */ break; case variable: /* 变量 */ table[(*ptx)].level = lev; table[(*ptx)].adr = (*pdx); (*pdx)++; case procedure: /* 过程 */

2.命令代码生成过程gen 每调用一次过程gen,在程序存储器里产生一条代码指令 void gen(enum fct x, int y, int z ) { if (cx >= cxmax) { printf("Program is too long!\n"); /* 生成的虚拟机代码程序过长 */ exit(1); } if ( z >= amax) { printf("Displacement address is too big!\n"); /* 地址偏移 越界 */ code[cx].f = x; code[cx].l = y; code[cx].a = z; cx++;

3.表达式、项、因子及关系式的翻译 表达式的翻译 中缀表达式与后缀表达式 后缀表达式:操作符总是跟随在它操作数的后边 后缀表达式翻译规则 T(“+”term)=T(term) T(“-”term)= T(term) “-” T(term1”+”term2)= T(term1) T(term2) “+” T(term1”-”term2)= T(term1) T(term2) “-” T(term1”*”term2)= T(term1) T(term2) “*” T(term1”/”term2)= T(term1) T(term2) “/” T(“(”expression”)”)=T(expression)

Example 后缀表达式 xy+zw-/ (x+y)/(z-w) Lod x Lod y Opr 0,2 Lod z Lod w

expression过程的扩充 term过程的扩充 factor过程的扩充 condition过程的扩充

4.语句的翻译 T(expression) Sto lev-level, adr 赋值语句的翻译处理 T(Ident”:=”expression) T(expression) Sto lev-level, adr

T(condition) Jpc, L1 T(statement) L1: … if语句的翻译处理 T(“if” condition “then” statement) T(condition) Jpc, L1 T(statement) L1: …

L1: T(condition) Jpc, L2 T(statement) jmp L1 L2: … while语句的翻译处理 T(“while” condition “do” statement) L1: T(condition) Jpc, L2 T(statement) jmp L1 L2: …

call语句的翻译处理 T(“call” ident) cal, lev-level, adr

5.生成PL/0目标代码程序 执行program6 在SI-NS图上执行program6 直接从PL/0程序翻译写出目标代码程序

对分程序的定义: void block(int lev, int tx, bool* fsys) {…} cx0: 保留本过程目标代码的起始位置

其中: 对分程序体入口的处理: dx = 3; /* 三个空间用于存放静态链SL、动态链DL和返 回地址RA */ tx0 = tx; /* 记录本层标识符的初始位置 */ table[tx].adr = cx; /*记录当前层代码的开始位置 */ gen(jmp, 0, 0); /* 产生跳转指令,跳转位置未 知暂时填0 */ 其中: cx已保留在过程名的adr域,等生成过程体入口的指 令时,再由table[tx].adr中找到 cx将过程体入口返 填到cx中,即( jmp,0,0)的第3区域,同时将过程 体入口填到过程名的table[tx].adr中。

分程序的处理 (0) jmp 0 0 table[tx].adr:=cx; CX:(1 ) jmp 0 0 记录 过程在code的入 口到table中的adr域 CONST A=35,B=49; VAR C,D,E; PROCEDURE P; VAR G tx 名字 类型 层次/值 地址 存储空间

过程体入口时的处理 code[table[tx0].adr].a:=cx; (回填过程入口地址到code的a中) with table[tx0] do begin adr:=cx; (过程的入口填 写在table中) size:=dx; (过程占的空间填 写在table中) end; cx0:=cx; gen(int,0,dx);(生成过程入口指令) 保留过程在code中的入口地址,打印目标代码用

过程体入口时的处理 code[table[tx0].adr].a = cx; /* 把前面生成的 跳转语句的跳转位置改成当前位置 */ table[tx0].adr = cx; /*记录当前过程代码地址*/ table[tx0].size = dx; /* 声明部分中每增加一条 声明都会给dx增加1,声明部分已经结束,dx就是 当前过程数据的size */ cx0 = cx; /* 保留过程在code中的入口地址,打印 目标代码用*/ gen(ini, 0, dx); /* 生成指令,此指令执行时在 数据栈中为被调用的过程开辟dx个单元的数据区 */

过程体入口时的处理 CONST A=35;B=49; VAR C,D,E; PROCEDURE P; VAR G (0) jmp 0 0 code[table[tx0].adr] .a=cx; table[tx0].adr =cx; 填写过程在code和 table中的入口地址 (0) jmp 0 0 (1 ) jmp 0 0 . . . ( cx ) int 0 4 tx0 名字 类型 层次/值 地址 存储空间