编译原理上机辅导
北京航空航天大学《编译原理》第1章 概论

(1) * T1 (2) := X1
北京航空航天大学计算机学院
五、生成目标程序
由中间代码很容易生成目标程序(地址指令序列)。这 部分工作与机器关系密切 ,所以要根据机器进行。在做这 部分工作时(要注意充分利用累加器),也可以进行优化 处理。 X1:= ( 2.0 + 0.8 ) * C1
北京航空航天大学计算机学院
教学要求
• 掌握编译程序总体结构 • 在系统级上认识算法、系统的设计
– 具有把握系统的能力
• 学习有关的原理、实现方法和技术,了解计算学 科的基本方法、思想
– 掌握典型方法。 “在每一个计算机科技工作者的职业 生涯中,这些原理和技术都被反复用到。”
• 兼顾语言的描述方法、设计、应用——形式化
北京航空航天大学计算机学院
X1:= ( 2.0 + 0.8 ) * C1;
赋值语句 X1
:= 表达式 ;
表达式
* )
C1
(
2.0
表达式
也称为层次分析。 + 0.8
北京航空航天大学计算机学院
三、语义分析、生成中间代码
任务:对识别出的各种语法成分进行语义分析, 并产生相应的中间代码。 • 中间代码:一种介于源语言和目标语言之间的中间语言形式 • 生成中间代码的目的: <1> 便于做优化处理; <2> 便于编译程序的移植。 • 中间代码的形式:编译程序设计者可以自己设计,常用的有 四元式、三元式、逆波兰表示等。
北京航空航天大学计算机学院
源程序、翻译程序、目标程序 三者关系: 源程序
SOURCE PROGRAM
《编译原理教程》习题解析与上机指导(第四版) 第七章

(1) 试应用DAG进行优化; (2) 假定只有R、H在基本块出口是活跃的,写出优化后 的四元式序列; (3) 假定只有两个寄存器AX、BX,试写出上述优化后 的四元式序列的目标代码。 【解答】 (1) 根据DAG的构造算法构造基本块P的DAG 步骤如图7-1的(a)到(h)所示。
MOV MUL
R1, A R1, R0 该结果
//取一个空闲寄存器 R1 //运算结束后 R1 中为 T2 结果,内存中无
MOV R0, D
ADD R0, ?1? 该结果
/*此时 R0 中结果 T1 已经没有引用点, 且临时单元 T1 是非活跃的,所以,寄存 器 R0 可作为空闲寄存器使用*/ //运算结束后 R0 中为 T3 结果,内存中无
本块时,所有的寄存器被当成空闲的寄 存器使用,从而造成计算结果的丢失。
考虑到寄存器 R0 中的 T5和寄存器 R1 中 的 W,临时单元 T5 是非活跃的,因此 只要将结果 W 存回对应单元即可*/
7.4 对基本块 P:
S0=2 S1=3/S0 S2=T-C S3=T+C R=S0/S3 H=R S4=3/S1 S5=T+C S6=S4/S5 H=S6*S2
我们以四元式T=a+b为例来说明其翻译过程。 汇编语言的加法指令代码形式为
ADD R, X
其中,ADD为加法指令;R为第一操作数,第一操作数必须 为寄存器类型;X为第二操作数,它可以是寄存器类型,也 可以是内存型的变量。ADD R,X指令的含义是:将第一操 作数R与第二操作数相加后,再将累加结果存放到第一操作 数所在的寄存器中。要完整地翻译出四元式T=a+b,则可能 需要下面三条汇编指令:
MOV T2, R1
MOV R1, E SUB R1, F MUL R0, R1
编译原理上机报告

编译原理上机报告⼀.实验⽬的通过设计并完成⼀个简单的”函数图形绘制程序”,使同学基本上学会编译技术中的词法分析器,语法分析器的构造⽅法,并初步掌握语法制导翻译技术,使同学对编译器的构造⽅法以及编译过程有清楚的感性认识..⼆.实验任务语⾔的⾮形式描述,语⾔的描述包括语法和语义两个部分,此处采⽤⾮形式化的描述,.上机实验包括词法分析和语法分析以及语义分析,分别实现戏词法分析器,语法分析器和图形绘制的设计编码与调试。
三.模块的划分和模块间关系此部分主要由三部分组成:词法分析,语法分析和语义分析。
1.词法分析词法分析器⾄少完成两个任务:〈1〉滤掉注释和⽆⽤成分。
〈2〉数别记号供语法分析器使⽤(1)与语法分析器的接⼝:名称:InitScanner 功能:初始化词法分析器参数:被分析的输⼊⽂件名返回值:成功/失败(1/0)名称:GetToken 功能:取得⼀个记号参数:⽆返回值:记号的种别名称:CloseScanner 功能:关闭词法分析器参数:⽆其框图如下:(2)记号的设计为了区分记号,把程序中所能出现的记号名,函数名,常量名,参数名,保留字都包含在⼀个数组中,数组中的成员都是CToken的对象。
其定义如下:2(3)与实现有关的问题A.字符输⼊缓冲区在设计的语⾔中,最多只预读⼀个字符,假设输⼊⽂件为InFile,,则Char=getc(InFile) //完成读字符ungetc(Char,InFile) //完成回退字符B.模式识别记号按如下⽅法分类:〈1〉标⽰符⼀个模式,包括保留字,函数名,T及Pi,E〈2〉常数字⾯量⼀个模式〈3〉其它符号每种⼀个模式C.词法分析器的调试词法分析器的主代码如下:#include"scanner.h"void main(int argc,char*argv[]){Token token;if(argc<2){printf("please input Source File!\n");return;}if(!InitScanner(argv[1])) //初始化词法分析器{printf("Open Source File Error!\n"); return;}printf("记号类型字符串常数值函数指针\n");printf("_________________________________________________________\n");while(1){token=GetToken(); //获得记号if(token.type!=NONTOKEN) //打印记号的内容printf("%4d,%12s,%12f,%12x\n",token.type,token.lexeme,token.value,token.FuncPtr);else break;};printf("___________________________________________________________\n");CloseScanner();}如有绘图语句如下:scale is(100, 100);for t from 0 to 2*pi step pi/300经词法分析器编译可得结果如下:2语法分析器词法分析与语法分析的区别之⼀是,词法分析是线性的,⽽语法分析是⾮线性的。
编译原理 第六章 上机辅导

23
3.3 语法分析器
语法分析器的任务:分析语言的结构 1. 为句子构造语法树; 2. 检查输入序列中的错误。 主要工作: 1. 设计SQL语言的文法; 2. 设计语法树的节点,用于存放表达式的语法树; 3. 利用YACC工具分析SQL语句,并构造语句的语法树; 4. 设计测试程序和测试用例,检验分析器是否正确。
19
3.2 词法分析器
SQL语句中的记号: [例] CREATE TABLE Student ( Sno CHAR(9), Sname CHAR(20), Ssex CHAR(2), Sage INT ); 上边的SQL语句包括哪些记号? 关键字:CREATE TABLE CHAR INT 标示符:Student Sno Sname Ssex Sage 数字: 9,20,2 其他符号:' ( ' ' ) ' ' , ' ' ; '
11
12
3.1 数据库存储结构设计
综上所述,建立一个表时有以下2步: 1. 将表对应的表字典表的数据插入.dat文件中,也就是向表 字典表中添加一条记录。 例如:
Students 表名 1 表id 4 列数 35 列总长度 1 起始块 NULL 保留
2. 将表对应的列字典表的数据插入.dat文件中,即向列字典 表中添加表的各列对应的记录。 例如: 1 1 Sno 1 9 0 NULL
20
LEX源程序基本结构如下: [声明]%% 翻译规则 [%% 用户定义子程序]
21
3.2 词法分析器
用正则式识别记号 CREATE TABLE对应的LEX源程序:
CREATE TABLE CHAR INT {return CREATE;} {return TABLE;} {return CHAR;} {return INT;}
编译原理上机实验指导(词法-2005级)

小型编译程序的词法设计与实现本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码(四元式),编译程序的重点放在中间代码生成阶段。
编译程序的输出结果包括词法分析后的二元式序列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。
整个程序分为三个部分:(1)词法分析部分(2)语法分析、语义分析及四元式生成部分(3)输出显示部分1.词法分析器设计词法分析器的功能是输入源程序,输出单词符号。
我们规定输出的单词符号格式为如下的二元式:(单词种别编码,单词自身的值)由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查。
1.1 单词符号的内部定义及在编译程序中的定义我们对常量、变量、临时变量、保留关键字(if、while、begin、end、else、#define sy_if 0#define sy_then 1#define sy_else 2#define sy_while 3#define sy_begin 4#define sy_do 5#define sy_end 6#define a 7#define semicolon 8#define e 9#define jinghao 10#define S 11#define L 12#define tempsy 15#define EA 18 /*E and*/#define E0 19 /*E or*/#define plus 34#define times 36#define becomes 38#define op_and 39#define op_or 40#define op_not 41#define rop 42#define lparent 48#define rparent 49#define ident 56#define intconst 571.2 变量及数据结构说明编译程序中涉及到的变量及数据结构说明如下:char ch='\0'; /*从字符缓冲区读取当前字符*/ int count=0; /*词法分析结果缓冲区计数器*/ static char spelling[10]={""}; /*存放识别的单词符号*/static char line[81]={""}; /*一行字符缓冲区,最多80个字符*/ char *pline; /*字符缓冲区指针*/static char ntab1[100][10]; /*变量名表,共100项,每项长度10*/ struct rwords{char sp[10];int sy;}; /*保留字表的结构,用来与输入缓冲区中的单词进行匹配*/ struct rwords reswords[10]={{"if",sy_if},{"do",sy_do},{"else",sy_else},{"while",sy_while},{"then",sy_then},{"begin",sy_begin},{"end",sy_end},{"and",op_and},{"or",op_or},{"not",op_not}}; /*保留字表初始化,大小为10*/ struct aa{int sy1; /*存放单词符号的种别编码*/int pos; /*存放单词符号自身的值*/}buf[1000]; /*词法分析结果缓冲区,保存识别出来的单词符号*/ int nlength=0; /*词法分析中记录单词的长度*/int tt1=0; /*变量名表指针*/FILE *cfile; /*源程序文件, 为结束符*/int lnum=0; /*源程序行数记数*/1.3 主函数main()void main(){cfile=fopen("pas.dat","r"); /*打开C语言源文件*/readch(); /*从源文件读一个字符*/scan(); /*词法分析*/disp1(); /*打印词法分析结果*/disp3(); /*打印词法分析变量名表*/printf("\n程序运行结束!\n");getch();}1.4 词法分析函数说明(1)读取函数 readline( )、readch( )词法分析包含从源文件读取字符的操作,但频繁的读文件会影响程序执行效率,故实际上是从源程序文件“pas.dat”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行readch()从输入缓冲区获得的;若缓冲区已被读空,则再执行readline()从pas.dat中读取下一行至输入缓冲区。
西电_编译原理上机报告

编译原理上机报告《DBMS的设计与实现》学号:姓名:手机:邮箱:完成时间:2013 年6月21日目录1.项目概况 (3)1.1基本目标 (3)1.2完成情况 (3)2.项目实现方案 (4)2.1逻辑结构与物理结构 (4)2.2语法结构与数据结构 (7)2.3执行流程 (19)2.4功能测试 (39)3.总结与未来工作 (48)3.1未完成功能 (48)3.2未来实现方案 (48)1.项目概况1.1 基本目标设计并实现一个DBMS原型系统,可以接受基本的SQL语句,对其进行词法分析、语法分析,然后解释执行SQL语句,完成对数据库文件的相应操作,实现DBMS的基本功能。
1.2 完成情况1.CREATE DATABASE 创建数据库2.SHOW DATABASES 显示数据库名3.DROP DATABASE 删除数据库E DATABASE 选择数据库5.CREATE TABLE 创建表6.SHOW TABLES 显示表名7.DROP TABLE 删除表8.INSERT 插入元组9.SELECT 查询元组10.DELETE 删除元组11.UPDATE 更新元组12.EXIT 退出系统2.项目实现方案2.1 逻辑结构与物理结构1.逻辑结构(1)系统数据库1)元数据的逻辑结构在我设计的系统数据库中,虽然建有元数据的文件,但是文件中没有任何数据,所以元数据的逻辑结构不存在。
2)基本数据的逻辑结构表1 系统数据库的基本数据的逻辑结构(2)用户数据库1)元数据的逻辑结构由于在我的设计中,为数据库中每个表创建一个基本数据文件,所以不需要ppt中的“起始页”,添加了一个“表中列的数目”的列,如下表所示:说明:表中col_type列,取值为整数,1表示字符串,2表示整型2)基本数据的逻辑结构与ppt中的参考方案不同的是,对于数据库中的每一个表,我并不是把每个表的基本数据均存放在一个与数据库同名的基本数据文件中,而是为每个表创建一个与表同名的基本数据文件。
编译原理教案
编译原理教案说明:一、参考书:1、陈意云、张昱:《编译原理》,高等教育出版社,2003年。
2、陈意云、张昱:《编译原理习题精选》,中国科技大学出版社,2003年。
3、吕映芝、张素琴、蒋维杜:《编译原理》,清华大学出版社,1998年第二版。
4、王生原、吕映芝、张素琴:《编译原理课程辅导》,清华大学出版社,2007年。
5、伍春香:《编译原理习题与解析》,清华大学出版社,2001年。
6、Andrew W.Appel:《现代编译原理—C语言描述》,人民邮电出版社,2005年。
7、Noam Nison等:《计算机系统要素》,电子工业出版社,2007年。
8、Randall Hyde:《编程卓越之道(第二卷)》,电子工业出版社,2007年。
二、教学目的:通过学习形式语言与自动机理论、词法分析、语法分析、语义分析、代码优化和生成等内容使学生掌握构造编译程序的基本原理和基本方法,并通过上机实习使学生进一步掌握开发应用程序的基本方法,为深入理解计算机系统、程序设计语言与开发大型应用程序打下良好的基础。
三、教学时数:课堂教学51学时,上机实验30学时。
四、授课内容:第一章编译程序概述第二章 PL/0编译程序的实现第三章文法和语言第四章词法分析第五章自顶向下语法分析方法第六章自底向上优先分析方法第七章 LR分析方法第八章语法制导翻译和中间代码生成第九章符号表第一○章目标程序运行时的存储组织第一一章代码优化第一二章代码生成第一章概述一、说明:1、教学目的与要求:了解编译程序的概念、结构以及工作流程。
2、主要内容:什么是编译程序、编译过程概述、编译程序的结构、编译阶段的组合、编译技术和软件工具以及实例分析。
3、教学重点:编译程序的结构以及每一阶段的任务。
4、教学难点:理解编译程序各模块的判错功能、编译方式和解释方式执行速度上的不同。
二、教学内容第一节编译程序1、机器语言:直接用计算机能够识别的二进制代码指令来编写程序的语言。
编译原理课程设计c语言编译器
编译原理课程设计 c语言编译器一、教学目标本课程的目标是让学生掌握C语言编译器的基本原理和实现方法。
通过本课程的学习,学生应能够理解编译器的主要组成部分,如词法分析器、语法分析器、中间代码生成器、优化器和目标代码生成器等;掌握编译器的设计方法和实现技巧,如有限自动机、递归下降分析和代码优化等;能够独立设计和实现一个小型的C语言编译器。
二、教学内容本课程的教学内容主要包括C语言编译器的基本原理、编译器的设计方法和实现技巧。
具体包括以下几个部分:1.C语言编译器的概述:介绍编译器的作用、编译过程和编译器的种类等。
2.词法分析:介绍词法分析器的原理和实现方法,包括正则表达式、有限自动机等。
3.语法分析:介绍语法分析器的原理和实现方法,包括递归下降分析、LL分析、LR分析等。
4.中间代码生成:介绍中间代码生成器的原理和实现方法,包括三地址码、静态单赋值码等。
5.代码优化:介绍代码优化的原理和实现方法,包括常数折叠、死代码消除等。
6.目标代码生成:介绍目标代码生成器的原理和实现方法,包括机器码生成、寄存器分配等。
三、教学方法本课程的教学方法采用讲授法、讨论法和实验法相结合的方式。
在讲授基本原理和方法的同时,通过案例分析和讨论,让学生更好地理解和掌握相关知识。
同时,通过实验环节,让学生亲手设计和实现C语言编译器的基本模块,提高学生的实践能力和创新能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。
教材主要包括《编译原理》、《C语言编译器》等;参考书包括《编译原理学习指导》、《编译器设计实践》等;多媒体资料包括教学PPT、视频讲座等;实验设备包括计算机、编程环境等。
教学资源将全程支持教学内容和教学方法的实施,丰富学生的学习体验。
五、教学评估本课程的评估方式包括平时表现、作业、考试等多个方面,以全面客观地评价学生的学习成果。
平时表现主要考察学生的出勤、课堂参与度和团队协作能力;作业分为课后练习和实验报告,用以巩固和检验学生的学习效果;考试包括期中考试和期末考试,全面测试学生的知识掌握和应用能力。
编译原理课程设计教案
编译原理课程设计教案一、课程简介1.1 课程背景编译原理是计算机科学与技术领域的基础课程,旨在培养学生对编译器设计和实现的理解。
通过本课程的学习,学生将掌握编译器的基本原理、构造方法和实现技巧。
1.2 课程目标(1)理解编译器的基本概念、工作原理和分类;(2)熟悉源程序的词法分析、语法分析、语义分析、中间代码、目标代码和优化等基本过程;(3)掌握常用的编译器构造方法和技术;(4)能够设计和实现简单的编译器。
二、教学内容2.1 词法分析(1)词法规则的定义和描述;(2)词法分析器的实现方法;(3)词法分析在编译器中的作用和重要性。
2.2 语法分析(1)语法规则的定义和描述;(2)语法分析树的构建方法;(3)常用的语法分析算法及其特点。
2.3 语义分析(1)语义规则的定义和描述;(2)语义分析的方法和技巧;(3)语义分析在编译器中的作用和重要性。
2.4 中间代码(1)中间代码的定义和表示;(2)中间代码的方法和策略;(3)中间代码在编译器中的作用和重要性。
2.5 目标代码和优化(1)目标代码的方法和技巧;(2)代码优化的方法和策略;(3)目标代码和优化在编译器中的作用和重要性。
三、教学方法3.1 讲授法通过讲解编译原理的基本概念、理论和方法,使学生掌握编译器的设计和实现技巧。
3.2 案例分析法分析实际编译器的设计和实现案例,使学生更好地理解编译原理的应用。
3.3 实验法安排实验课程,让学生动手设计和实现简单的编译器组件,提高学生的实际操作能力。
3.4 小组讨论法组织学生进行小组讨论,培养学生的团队合作精神和沟通能力。
四、教学评价4.1 平时成绩包括课堂表现、作业完成情况和小测验成绩,占总评的30%。
4.2 实验成绩包括实验报告和实验演示,占总评的30%。
4.3 期末考试包括理论知识考核和实际操作考核,占总评的40%。
五、教学资源5.1 教材推荐使用《编译原理》教材,为学生提供系统、全面的学习资料。
5.2 课件制作精美、清晰的课件,辅助课堂教学。
编译原理上机三
编译原理上机报告上机题目编写语法分析分析器上机时间 11月18日学院信息与控制工程学院专业计算机科学与技术班级计算机1301班姓名周砚豪一、实验目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。
1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,并至少完成两个题目。
2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
二、实验过程(一)根据分析法总控制流程图,编写一个分析对象的语法分析程序。
可根据自己的能力选择以下三项(由易到难)之一作为分析算法中的输入:1.直接输入根据已知文法人工构造的分析表M。
2.输入已知文法的集合FIRST(x)和FOLLOW(U),由程序自动生成该文法的分析表M。
3.输入已知文法,由程序自动生成该文法分析表M。
??(二)程序具有通用性,即所编制的LL(1)语法分析程序能够适用于不同文法以及各种?输入单词串,并能判断该文法是否为算符文法和算符优先文法。
??(三)有运行实例。
对于输入的一个文法和一个单词串,所编制的语法分析程序应能正确地判断,此单词串是否为该文法的句子,并要求输出分析过程。
??三、实验结果四、讨论与分析LL(1)文法的判定:对于文法G的每一个非终结符U的产生式: U →α1|α2|…|αn。
如果文法G是一个LL(1)文法,则有SELECT(U→αi)∩SELECT(U→αj)=Ф(i≠j,i,j=1,2,…,n)。
SELECT集的构造:SELECT(U →α)=?FIRST(α),当α不空FIRST(α)∪FOLLOW(U),否则LL(1)分析表构造算法:?对于每个产生式U→α,执行下一步骤:1、对于每个终结符号:a∈FIRST(α),M[U,a]=?→α?;?2、如果e∈FIRST(α?),对于每个终结符号:b∈FOLLOW(U),M[U,b]=?→α?;?3、将其它未定义的分析元素置为ERROR。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题:如何实现大小写不敏感?
目录
1. 2. 3. 4. 上机题目 改进建议 验收方式 参考解决方案 基本框架 词法分析器生成器Lex SQL词法分析器 语法分析器生成器Yacc SQL语法分析器 语法制导翻译设计 SQL语法制导翻译
25
4 参考解决方案
语法分析器生成器Yacc
4 参考解决方案
";" "(" ")" "," | | | {return yytext[0]; } CREATE TABLE ID (ID CHAR(NUMBER), ID CHAR(NUMBER), ID CHAR(NUMBER), ID INT );
24
CREATE TABLE Student ( Sno CHAR(9), Sname CHAR(20), Ssex CHAR(2), Sage INT );
EXE
输入
EXE
记号流
注意:不同版本的Lex生成的 文件不同
14
4 参考解决方案
Lex源程序*.l(三段式): [定义 C声明 辅助定义正规式 ] %% 规则 词法规则正规式 语义动作(C代码) [%% 用户子程序 C源程序 ] lex.yy.c结构:
(1)声明的C语言部分
(2)词法分析表
(3)词法分析驱动器(yylex())
Lex转化
分析表(DFA)
13
4 参考解决方案
利用Lex构造词法分析器:实质为如何设计正规式和语义动作
Lex源程序*.l(三段式): [定义 C声明 辅助定义正规式 ] %% 规则 词法规则正规式 语义动作(C代码) [%% 用户子程序 C源程序 ]
*.l
lex.yy.c
Lex编译器
C 编译器
lex.yy.c
4 参考解决方案
mylexer.l源代码: //声明部分 %{ #define ID 0 #define NUMBER 1 %}
//C声明:记号类别
将来在Yacc中使用下列语句代替: %Token ID NUMBER
char [a-zA-Z] digit [0-9] //辅助定义正规式 digits {digit}+ optional_fraction ("."{digits})? optional_exponent (E[+-]?{digits})?
22
4 参考解决方案
LEX源程序: CREATE TABLE CHAR INT {return CREATE;} {return TABLE;} {return CHAR;} {return INT;}
[A-Za-z][A-Za-z0-9_]* { yylval.yych=(char *)malloc(strlen(yytext)+1); strcpy(yylval.yych, yytext); return ID;} 引入Yacc后再起作用 [0-9]+ { yylval.yych=(char *)malloc(strlen(yytext)+1); strcpy(yylval.yych, yytext); 23 return NUMBER; }
8
目录
1. 2. 3. 4. 上机题目 改进建议 验收方式 参考解决方案 基本框架 词法分析器生成器Lex SQL词法分析器 语法分析器生成器Yacc SQL语法分析器 语法制导翻译设计 SQL语法制导翻译
9
4 参考解决方案
基本框架
SQL语句 词法分析器 语法分析器 语义子程序 DBMS (a)DBMS工作原理 C/C++编译器 (b) 手工编写 Lex C/C++编译器 DBMS DBMS 执行结果
(4)用户定义子程序
28
4 参考解决方案
实例2:算术运算表达式识别器—仅使用Yacc 基本步骤: 1. 使用Parser Generator创建一个工程calc 编写y文件myparser.y; 编译myparser.y,生成myparser.h与myparser.c; 2. 使用VC++创建Win32 Console Application工程calc 配置该项目; 加入myparser.h与myparser.c,编译工程; 执行算术运算表达式识别器; 注意:每次修改y文件后,需要重新编译y文件,再重新编 译VC工程
EXE
输入
EXE
语法树
注意:不同版本的Yacc生成 的文件不同
27
4 参考解决方案
Yacc源程序*.y(三段式): [定义 C声明 符号定义 ] %% 规则 语法规则产生式 语义动作(C代码) [%% 用户子程序 C源程序 ] y.tab.c结构:
(1)声明的C语言部分
(2)语法分析表
(3)语法分析驱动器(yyparser())
2
1 上机题目
DBMS的设计与实现:
设计并实现一个DBMS原型系统,可以接受基本的SQL语 句,对其进行词法分析、语法分析,然后解释执行SQL 语句,完成对数据库文件的相应操作,实现DBMS的基 本功能。
目的:
1. 加深编译原理基础知识的理解:词法分析、语法分析、 语法制导翻译等; 2. 加深相关基础知识的理解:数据库系统、数据结构、操 作系统等。
3
1 上机题目
基本SQL语句及功能: 1. CREATE DATABASE 创建数据库 2. USE DATABASE 选择数据库 3. CREATE TABLE 创建表 4. SHOW TABLES 显示表名 5. INSERT 插入元组 6. SELECT 查询元组 7. UPDATE 更新元组 8. DELETE 删除元组 9. DROP TABLE 删除表 10. DROP DATABASE 删除数据库 11. EXIT 退出系统 注:支持数据类型有INT、CHAR(N) 等
6
目录
1. 2. 3. 4. 上机题目 改进建议 验收方式 参考解决方案 基本框架 词法分析器生成器Lex SQL词法分析器 语法分析器生成器Yacc SQL语法分析器 语法制导翻译设计 SQL语法制导翻译
7
3 验收方式
时间: 最后一次上机; 条件:(不合条件者验收成绩默认为及格) 1. 完成SQL词法分析器; 2. 完成SQL语法分析器; 3. 完成SQL语法制导翻译; 方法: 1. 演示程序的功能; 2. 解释程序的源代码; 成绩: 验收成绩+报告成绩(是否雷同)+奖励分
17
4 参考解决方案
%% //词法规则正规式 {char}({char}|{digit})* { printf("识别标识符%s:长度为%d\n", yytext, yyleng); //语义动作:C代码 return ID; } {digits}{optional_fraction}{optional_exponent} {printf(“识别数字%s:长度为%d\n", yytext, yyleng); return NUMBER; yytext,yyleng:全局变量,用来存放识别 } 出的输入序列,由词法分析器自动填写 %% int main(void) //C源程序 { printf("词法分析成功,返回记号类别为%d\n", yylex()); } yylex():词法分析驱动器,根据词法规则
词法l文件
语法y文件
Yacc
语义子程序 (c)工具生成
10
4 参考解决方案
工具: 1. 编译器:Visual C++ 2. Lex与Yacc:Parser Generator(支持C/C++/Java,带实例) 参考书:
11
目录
1. 2. 3. 4. 上机题目 改进建议 验收方式 参考解决方案 基本框架 词法分析器生成器Lex SQL词法分析器 语法分析器生成器Yacc SQL语法分析器 语法制导翻译设计 SQL语法制导翻译
DBMS示例 测试程序
4
目录
1. 2. 3. 4. 上机题目 改进建议 验收方式 参考解决方案 基本框架 词法分析器生成器Lex SQL词法分析器 语法分析器生成器Yacc SQL语法分析器 语法制导翻译设计 SQL语法制导翻译
5
Байду номын сангаас
2 改进建议
改进建议
1. 安全; 2. 视图; 3. 索引(主码、外码、约束); 4. 事务(日志)。 大致思路: 1. 设计词法规则; 2. 设计语法规则; 3. 更改数据库物理存储结构; 4. 设计语义规则; 5. 编程实现。
Yacc是一个语法分析器生成器,接受产生式表示的语法规则, 生成识别产生式所描述语言的源程序,不同版本的Yacc支 持不同的高级语言,如C、C++、Java等。 语法分析器 产生式
输入记号流 ip top 符 号 状 态 栈 驱动器 移进-归约 分析表 输出
人工编写
识别活前缀的 DFA
分析表+驱动器
Yacc转化
26
4 参考解决方案
利用Yacc构造语法分析器:实质为如何设计产生式和语义动作
Yacc源程序*.y(三段式): [定义 C声明 符号定义 ] %% 规则 语法规则产生式 语义动作(C代码) [%% 用户子程序 C源程序 ]
*.y
y.*
Yacc编译器
C 编译器
y.tab.c y.tab.h y.output
20
4 参考解决方案
SQL词法分析器
1. 词法分析器的三个任务: 滤掉源程序中的无用成分; 输出记号供语法分析器使用; 识别非法输入,标记为出错记号 2. SQL记号的分类:关键字、标识符、数字、运算等。 3. 记号的组成:记号的类别和属性