编译原理实践 7.PL/0的词法分析程序构造.

Slides:



Advertisements
Similar presentations
猜谜语 有个小娃娃,真是没 礼貌。 见到小树摇一摇,吓 得树叶哇哇叫。 见到小花逗一逗,摘 去她的太阳帽。 没人和它交朋友,只 好自已到外处跑。
Advertisements

组长:倪运超 小组成员:徐悦、曹吕卿、孙浩、徐圣尧.  上海的历史 上海的历史  上海的历史 上海的历史  上海的文化 —— 建筑 上海的文化 —— 建筑  上海的文化 —— 美食 上海的文化 —— 美食  香港的历史 香港的历史  香港的历史 香港的历史  香港的文化 —— 建筑 香港的文化.
一、 突出解析几何复习中的重点问题的通法通解 解析几何中的重点问题 一、 突出解析几何复习中的重点问题的通法通解 直线与圆锥曲线的位置关系 重点一.
不知者無罪嗎 ? 【本報台北訊】國內知名大學胡姓研究 生進口豬籠草在網路上販售,涉嫌違反 植物防疫檢疫法,胡姓研究生表示不知 道豬籠草是違禁品並當場認錯道歉 台北地檢署檢察官念他初犯,昨 天處分緩起訴,但命他繳交六萬 元緩起訴處分金作公益。 豬籠草有潛移性線蟲寄生,一旦植物感 染後,輕則枯萎凋零,重則危害農業經.
黄帝内经 内经教研室 王黎.
第十三章 中国的传统科学技术 中国古代的科技曾经长期处于世界领先地位,对人类文明的进步作出过重要贡献,并形成了富有特色的科技文化。在今天,源自中国古代科技文化的中医学仍然在现实生活中发挥着积极的作用。
职官与科举 职官:在国家机构中担任一定职务的官吏,这里面有职官的名称、职权范围和品级地位等方面的内容。
花开有日 芬芳天下 “国培计划(2012)” ——幼儿园骨干教师远程培训项目 山东幼儿园教师8班第4期简报 主办人:张瑞美     
《卖火柴的小女孩》 《海的女儿》 你 认 识 这 些 图 片 的 故 事 吗 《丑小鸭》 《拇指姑娘》 它们都来自于哪位作家笔下?
美国教育心理学家吉诺特说:在历经了若干年的教师工作之后,我得到了一个令人惶恐的结论:教育的成功与失败,我是决定性的因素,我个人采用的方法和每天的情绪,是造成学习气氛和情景的的主要原因。身为教师,我具有极大的力量,能够让孩子们活得愉快或悲惨,我可以是制造痛苦的工具,也可能是启发灵感的媒介。无论在什么情况下,一场危机之恶化和化解,学生是否受到感化,全部决定于我。
安 全 維 護 臺 東 林 區 管 理 處 消費安全 詐騙防範宣導 健康生活 毒家新聞 杜絕不明匯款及金融轉帳操作
四資二甲 第三週作業 物件導向程式設計.
C#程序设计案例教程 第3章 程 序 结 构.
雄伟的金字塔.
第一章 C语言概述 计算机公共教学部.
“机票预定”操作流程.
CC-484.
编译原理上机实习
开 学 第 一 课 六年级3班.
第三章 控制结构.
程式設計實作.
複習 struct score_Type{ int chinese,english; }; struct my_Type{
CH2 開發環境介紹 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇.
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
第二章 C# 基础知识.
C++Primer 3rd edition 中文版 Chap 5
助教:胡光能,解定宝 编译原理讲师:戴新宇
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
第三章 栈和队列.
编译原理实践 5.给定语法的语法分析程序构造.
个人介绍 我是小小.
THE C PROGRAMMING LANGUAGE
第2章 PL/0编译程序 2.1 PL/0语言和类pcode的描述 2.2 PL/0编译程序的结构 2.3 PL/0编译程序的语法语义分析
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第三章 C# 基础知识.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
第二章 词法分析4 词法分析程序实现 构造词法分析器步骤 单词的形式化描述 词法分析程序的实现.
编译原理实践 11.语义分析与代码生成.
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第 二 章 数据类型、运算符与表达式.
程式的時間與空間 Time and Space in Programming
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
字符串 (String) 字符串是 n (  0 ) 个字符的有限序列, 记作 S = “c1c2c3…cn” 其中,S 是串名字
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
编译原理课程设计 课程设计内容 扩展PL/0语言的实现(含编译器和解释器)  编译器:把源程序翻译成中间语言程序
隨機數 (亂數) 10後,取餘數 n = rand(); 利用 Code::Block 驗證一下 n = rand() %10; 998
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
注册建造师 《市政公用工程管理与实务》 环球网校 白老师 每个PPT都有对应的头和尾 PPT头包含内容:
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
介入及追蹤紀錄表 編號: 姓/稱謂: 初次103年 月 日 追蹤 月 日 問題型態 (可複選) □ 1. 覺得西藥都很傷胃
第七章  数 组.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
多重條件選擇敘述
C#快速導讀 流程控制.
C语言基本语句 判断循环.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Q1(a) 小偉打算編寫一個程序。該程序把兩個44的表內的數字相加。表3內的數字是由表1和表2應格子內的數字相加而成。例如:
Presentation transcript:

编译原理实践 7.PL/0的词法分析程序构造

词法分析方法的构造方法分类 词法分析程序的任务 词法分析程序的设计

1.词法分析程序的构造方法分类 讲述正规式(正则表达式)和有穷自动机理论, 目的是为了介绍词法分析程序自动构造工具Lex 的原理。词法分析程序不是通过编程,而是执行 Lex产生 采用Loop-and-Switch(循环和分支)方法 本课程采用第二种方法,Lex方法将在后续补充介 绍

2.词法分析程序的任务 词法分析程序的任务:对源程序进行扫描,提 供一个个符号给语法分析程序。 简称为扫描器(scanner)或扫描程序 词法分析程序实现的2种方案: 1.先单独工作一遍,把字符流源程序先变为符号 序列,输出到一个中间文件上,然后将这个文 件作为语法分析程序的输入继续第二遍的编译 过程 字符串源程序 词法分析 符号串源程序

2.有些编译程序将词法分析和语法分析安排在同一遍中, 此时词法分析作为语法分析程序的一个子程序。每当语 法分析需要一个新的符号时,就调用词法分析子程序, 词法分析子程序从字符串源程序中识别出一个具有独立 意义的单词,将其符号返给语法分析。这种方法避免了 中间文件,省去了送取符号工作,有利于提高编译程序 的效率。书中采用这种方案。 字符串源程序 词法分析器 语法分析器 取符号 送符号

程序getsym 本课程采用第2种方案,程序名getsym,预先审 视源程序下一个符号,并将读入的符号放在变量 sym中,语法分析的判断分析将以这个读入的符号 为基础 具体任务: 跳过空格字符 识别像begin、end、if、while等这样的保留字 识别非保留字,作为标识符处理 识别数字 识别专用符号组合,如:=、<=、>= 识别特殊的单个字符,如+、-、/、* 跳过注释行(书中例子程序没有体现)

辅助过程getch getsym需要一个辅助过程getch,每被调用一次 就读入下一个字符 除此之外的任务: 识别行结束标志,作为空格符处理 拷贝原文输出 在输出文件每行开始添加坐标(书中例子程序没有体 现)

3.词法分析程序的设计 每调用一次getsym,首先用循环结构在源程序上 向前读入一个非空格字符,然后对此字符进行分析, 转相应部分处理 处理保留字和标识符 处理常数 处理组合字符和单个字符

过程getch的功能:getch被getsym每调用一 次,就在inf输入文件上向前读取一个字符给ch 变量(书中给的pascal代码,本ppt给出c代码) char ch; /*最近一次从文件中读出的字符*/ int cc; /*行缓冲区指针,初始为0*/ int ll; /*行缓冲区长度,初始为0 */ char line[81]; /*行缓冲区*/

void getch() { if (cc == ll) /. 判断缓冲区中是否有字符,若无字符,则读入 下一行字符到缓冲区中 void getch() { if (cc == ll) /* 判断缓冲区中是否有字符,若无字符,则读入 下一行字符到缓冲区中 */ if (feof(fin)) printf("Program incomplete!\n"); exit(1); } ll = 0; cc = 0; ch = ' ';

while (ch != 10) {if (EOF == fscanf(fin,"%c", &ch)) { line[ll] = 0; break; } printf("%c", ch); fprintf(foutput, "%c", ch); line[ll] = ch; ll++; ch = line[cc]; cc++;

处理保留字和标识符 在词法分析程序getsym中,当读入的字符为a-z 的字母时候,就进入处理保留字和标识符的程序部 分 相关常量和变量说明: #define norw 13 /* 保留字个数 */ #define al 10 /* 标识符的最大长度 */ /* 符号 */ enum symbol { nul, ident, number, plus, minus, … };

enum symbol sym; /. 当前的符号. / char id[al+1]; /. 当前ident. / int num; / enum symbol sym; /* 当前的符号 */ char id[al+1]; /* 当前ident */ int num; /* 当前number */ char a[al+1]; /* 临时符号 */ int i,j,k; /* 临时变量 */ char word[norw][al]; /* 保留字表*/ enum symbol wsym[norw]; /* 保留字对应的符 号值 */ enum symbol ssym[256]; /* 单字符的符号值 */ 注意: 在init()中对word[][]、wsym[]、ssym[]进行了初始 化

if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) /* 当前的单词是标识符或是保留字 */ { k = 0; do { if(k < al) { a[k] = ch; k++; } getch(); }while ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')); a[k] = 0; strcpy(id, a);

i = 0; j = norw - 1; do { /. 搜索当前单词是否为保留字,使用 二分法查找 i = 0; j = norw - 1; do { /* 搜索当前单词是否为保留字,使用 二分法查找 */ k = (i + j) / 2; if (strcmp(id,word[k]) <= 0) { j = k - 1; } if (strcmp(id,word[k]) >= 0) i = k + 1; } while (i <= j);

if (i-1 > j) /. 当前的单词是保留字. / { sym = wsym[k]; } else /. 当前的单词是标识符 if (i-1 > j) /* 当前的单词是保留字 */ { sym = wsym[k]; } else /* 当前的单词是标识符 */ sym = ident;

处理常数 相关变量/常量说明 int num; /* 当前number */ #define nmax 14 /* 数字的最大位数 */

if (ch >= '0' && ch <= '9') /. 当前的单词是数字 if (ch >= '0' && ch <= '9') /* 当前的单词是数字 */ { k = 0; num = 0; sym = number; do { num = 10 * num + ch - '0'; k++; getch(); } while (ch >= '0' && ch <= '9'); k--; if (k > nmax) /* 数字位数太多 */ { error(30); } }

处理组合字符和单个字符 如果读入的字符既不是字母,也不是数字,就进入 余下的处理组合字符和单个字符的程序部分 注意: … sym = ssym[ch]; /* 当符号不满足上述条件时, 全部按照单字符符号处理 */

词法分析过程getsym总结:从源文件中读出若干 有效字符,组成一个token串,识别它的类型 为 保留字/标识符/数字或是其它符号: 如果是保留字,把sym置成相应的保留字类型,如果 是 标识符,把sym置成ident表示是标识符,于此同 时,id变量中存放的即为保留字字符串或标识 符名 字。 如果是数字,把sym置为number,同时num变量中 存放该数字的值。 如果是其它的操作符, 则直接把sym置成相应类型

词法分析举例 三个全程量: enum symbol sym; /* 当前的符号 */ char id[al+1]; /* 当前ident */ int num; /* 当前number */ const m=7; 序号 字符串 id num sym 1 const constsym 2 m ident 3 = eql 4 7 number 5 ; semicolon