西安电子科技大学编译原理04-4
电子科技大学编译原理--A2答案--网络教育
《计算机编译原理》试卷A2参考答案一、单项选择题(每小题1分,共25分)1、构造编译程序应掌握___D___。
A、源程序B、目标语言C、编译方法D、以上三项都是2、变量应当___C___。
A、持有左值B、持有右值C、既持有左值又持有右值D、既不持有左值也不持有右值3、编译程序绝大多数时间花在___D___上。
A、出错处理B、词法分析C、目标代码生成D、管理表格4、___D___不可能是目标代码。
A、汇编指令代码B、可重定位指令代码C、绝对指令代码D、中间代码5、使用___A___可以定义一个程序的意义。
A、语义规则B、词法规则C、产生规则D、词法规则6、词法分析器的输入是___B___。
A、单词符号串B、源程序C、语法单位D、目标程序7、中间代码生成时所遵循的是___C___。
A、语法规则B、词法规则C、语义规则D、等价变换规则8、编译程序是对___D___。
A、汇编程序的翻译B、高级语言程序的解释执行C、机器语言的执行D、高级语言的翻译9、文法G:S→xSx|y所识别的语言是___C___。
A、xyxB、(xyx)*C、x n yx n(n≥0)D、x*yx*10、文法G描述的语言L(G)是指___A___。
A、L(G)={α|S+ ⇒α ,α∈V T*}B、L(G)={α|S*⇒α,α∈V T*}C、L(G)={α|S*⇒α,α∈(V T∪V N*)}D、L(G)={α|S+ ⇒α,α∈(V T∪V N*)}11、有限状态自动机能识别___C___。
A、上下文无关文法B、上下文有关文法C、正规文法D、短语文法12、设G为算符优先文法,G的任意终结符对a、b有以下关系成立___C___。
A、若f(a)>g(b),则a>bB、若f(a)<g(b),则a<bC、A~B都不一定成立D、A~B一定成立13、如果文法G是无二义的,则它的任何句子α___A___。
A、最左推导和最右推导对应的语法树必定相同B、最左推导和最右推导对应的语法树可能不同C、最左推导和最右推导必定相同D、可能存在两个不同的最左推导,但它们对应的语法树相同14、由文法的开始符经0步或多步推导产生的文法符号序列是___C___。
西电编译原理_第二章习题解答
最终的正规式: 1* | 1*(01|0)* = 1*(01|0)*
© 西安电子科技大学 · 软件学院
5
1. 根据模式写出正规式
习题2.4 (2) 所有不含有子串 011 的01串 思路2:考虑包含 011 的串,然后构造没有011的串 ① 含有 子串 011 的最简单的串:
© 西安电子科技大学 · 软件学院
?
| (01|10) (00|11)* (01|10) )*
4
1. 根据模式写出正规式
习题2.4 (2) 所有不含有子串 011 的01串 思路1:简单例子,观察规律 (1) 最简单的串: 0 , 1, 11, 00, 10, 01, 010, …
(2) 上述各串重复: (0 | 00 | 01 | 010 )* = (01 | 0)*
© 西安电子科技大学 · 软件学院
7
2.依据NFA/DFA,给出正规式
思路1: 回顾“正规式 与 FA的关系”
正规集 描述 正规式 识别 有限自动机
正规式、FA是从两个不同的侧面表示一个集合(即正 规集)。所以,根本的方法是以正规集为桥梁, - 先分析清楚 FA 识别的集合之结构特征, - 然后再设计此集合的正规式。
© 西安电子科技大学 · 软件学院
2
1. 根据模式写出正规式
一般思路:(1)分析题意 (2)列举一些最简单的例子 (3)寻找统一规律*,考虑所有可能情况**
习题2.4 (1) 由偶数个0和奇数个1构成的01串
解:① 最简单的串有 0个0和1个1组成的串: 1 2个0和1个1组成的串:010 ,001,100 ② 在上述串的中间、两头添加偶数个0和/或偶数个1,即可 得到满足题意的其他串。 设偶数个0/偶数个1组成的串,可用正规式 A 表示,则最 终正规式: A1A | A0A1A0A
7西安电子科技大学《编译原理》
3.5.1 自下而上分析的基本方法
思路:从句子ω开始,从左到右扫描ω,反复用产生式的左部替换 产生式的右部、谋求对ω的匹配,最终得到文法的开始符号,或者 发现一个错误。
3.5.1.1 规范归约与“剪句柄”
定义3.13 设αβδ是文法G的一个句型, 若 存在S =*>αAδ,A =+>β, 则 称β是句型αβδ相对于A的短语, 特别的,若 有A→β, A→β 则 称β是句型αβδ相对于产生式A→β的直接短语。 一个句型的最左直接短语被称为句柄。 ■ ① 直观上,句型是一个完整结构,短语是句型中的某部分(针对 某非终结符)。S是一个句型,而不是一个短语(树根不是短语)。 ② 短语形成的两个要素: 1.从S可以推导出A,即S=*>αAδ; 2.从A至少一次推导出β,即A=+>β。
13
结
束
上节主要内容: 1. 自下而上分析的基本方法:归约(短语、直接短语、句柄、规 范(最左)归约) 2. 规范归约的形象表示-剪句柄; 3. 移进-归约分析工作模式:格局与格局变换 4. LR分析与LR文法: <1> 分析表:动作表与转移表 <2> 模拟算法:改变格局的两个重要动作-移进与归约 <3> LR分析器的实例分析 <4> LR文法
5
3.5.1.2 移进-归约分析器工作模式
移进-归约分析器的工作模式:
输入记号流 ip top 符 号 状 态 栈 驱动器 移进-归约 分析表 输出
与预测分析对比:
输入记号流 符 top 号 栈 ip 输出
驱动器 预测分析表 (b) 预测分析器模型
预测分析器: 移进-归约分析器: 1.分析方法:格局与格局变换 1. 分析方法:格局与格局变换 2.分析表 2. 分析表 3. 驱动器(模拟算法) 3. 驱动器(模拟算法) 4. LR(文法、语言、分析器) 4. 预测分析表的构造 5. LL(文法、语言、分析器) 5. SLR分析表的构造
西安电子科技大学编译原理 (10)
L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num
L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num
对文法的每个产生式A→α ② 对FIRST(α)的每个终结符a,加入α 到M[A,a]; ③ 若ε∈FIRST(α),则FOLLOW(A)每 个终结符b(包括#),加入α到M[A, b];
/ mod ( E;L TE' ε ε ) ; # ε
+
-
*
E'
T T' F
id
num
(E)
3.4 自上而下语法分析
...
E
T T F F id T FT
T
T FT
6
非终 结符 E E T T
输 入 符 号
id
E TE
+
E +TE
...
T FT T T FT
F
F id
栈
输
入
输
出
$E
id id + id$
id id + id$ id id + id$ id id + id$ id + id$ id + id$ id + id$ id + id$ F id
编译原理
习惯称法 汇编语言-机器指令:汇编(或交叉汇编) 程序设计语言-汇编语言或机器指令:编译(或解释) 高级语言之间:转换(或预编译) 逆向:反汇编、反编译
19
1.3 编译器与解释器
语言翻译的两种基本形态 先翻译后执行
源程序 编译器 目标程序 输出
边翻译边执行
源程序 输入数据
解释器
1.4 编译器的工作原理与基本组成
position = initial + rate 60
词法分析器
• 标识符position形成的记号是<id, 1> • id是标识符的总称 • 1代表position在符号表中的条目 • 符号表的条目用来存放标示符的 各种属性
• 赋值号=形成的记号是<assign> id, 1 = id, 2 + id, 3 60 •该记号只有一个实例,不需 要属性值来区分实例 •为了直观,记作<=> 符 号 表 • 标识符initial形成的记号是<id,2> 1 position ...
Java 处 理 过 程
计算机能够识别的语言
2
课程简介
翻译
汉语普通话
课程简介
高级程序设计语言
编译 (解释)
处 理 过 程
C 处 理 过 程
C++ 处 理 过 程
Java 处 理 过 程
My PL 处 理 过 程
计算机能够识别的语言
课程简介 介绍编 译器的 原理和 基本实 现方法
源程序 词法分析 语法分析 符 号 表 管 理 语义分析 中间代码生成 代码优化 目标代码生成 目标代码
17
1.1 从面向机器的语言到面向人类的语言
西安电子科技大学编译原理 (1)
8
b
2.3 记号的识别-有限自动机
NFA如何识别记号? 对字符串,从初态开始,是否可以经过一系列状态转 移到达终态? 例如:字符串abb是否可以被上页的NFA所识别
S = {0, 1, 2, 3} Σ = {a, b} move = { move(0, a) = {0, 1}, move(0, b) = 0, move(1, b) = 2, move(2, b) = 3 } s0 = 0 F = {3}
digit1=[1-9]
num=digit1(digit)*(ε |.digit*digit1)
3
2.3 记号的识别-有限自动机
正规式(模式的描述)
有限状态自动机(识别记号)
id = letter(letter|num)*
69fed? F987y?
正规式:(((letter|digit)*num)*|digit*}num)*
辅助定义
letter=[a-z,A-Z] digit=[0-9]
id = letter(letter|digit)* literal=“(letter|digit)*”
integer=digit digit*
num=integer(ε| . integer)
0000.0000 ? 0000.0000?
18
2.3 记号的识别-有限自动机
DFA对NFA施加的两条限制: 限制1:没有ε状态转移 限制2:同一状态经过同一字符最多有一个状态转移 [例2.10] 正规式(a|b)*abb的DFA,识别输入序列abb和abab:
a a b 0 b a a 3 2 b 1 b
0 1 2 3
a 1 1 1 1
西电编译原理_第二章习题解答
最终的正规式: 1* | 1*(01|0)* = 1*(01|0)*
© 西安电子科技大学 · 软件学院
5
1. 根据模式写出正规式
习题2.4 (2) 所有不含有子串 011 的01串 思路2:考虑包含 011 的串,然后构造没有011的串 ① 含有 子串 011 的最简单的串:
然后据上,考查每条从初态到终态的路径,综合正规式即可。
© 西安电子科技大学 · 软件学院 9
2.依据NFA/DFA,给出正规式
习题2.10 (2) 用正规式描述 DFA 所接受的语言;
0 b,c 2 b,c a b a a,c 1
该DFA从初态到终态有三条路径:0b2,0c2,0a1b2 用正规式表示为: b | c | a(a|c)*b, 而且是这三条路径均至少重复一次, 故最终的正规式为:(b|c|a(a|c)*b)+
© 西安电子科技大学 · 软件学院 13
其它
习题2.9 构造 10*1 的最小DFA 解: 活用 Thompson 算法 (1) 分解为三部分:1,0*,1; (2) 画出三者的状态转换图:
0 1 0 1 2 3 1 4
(3) 连接运算:子图首尾相连
0
1
0 1 1
1
4
这已经是最小的DFA
© 西安电子科技大学 · 软件学院
© 西安电子科技大学 · 软件学院
11
其它
关于:正规式 -> NFA -> DFA -> DFA最小化:
说明:(一般)逐步计算 正规式->NFA: (1)呆板Thompson算法: 自上而下分解正规式—— 语法树, 自下而上构造NFA —— 后续遍历; 特点:每个运算对应一次构造,繁琐! (2)活用Thompson算法: 分解正规式:得到若干规模适中的子正规式; 为每个子正规式:画出其最简的状态转换图(子图); 按Thompson算法,将子图组合,得到完整的图。
电子科技大学-计算机学院-编译原理实验-词法分析
#include<>#include<>#include<>#define MAX_COUNT 1024#define ILLEGAL_CHAR_ERR 1#define UNKNOWN_OPERATOR_ERR 2/*从标准输入读入第一个非空白字符(换行符除外)*/char getnbc(){char ch;ch = getchar();while (1){if (ch == '\r' || ch == '\t' || ch == ' '){ch = getchar();}else{break;}}return ch;}/*判断character是否为字母*/bool letter(char character){if ((character >= 'a'&&character <= 'z') || (character >= 'A'&&character <= 'Z')) return true;elsereturn false;}/*判断character是否为数字*/bool digit(char character){if (character >= '0'&&character <= '9')return true;elsereturn false;}/*回退字符*/void retract(char& character){ungetc(character, stdin);character = NULL;}/*返回保留字的对应种别*/int reserve(char* token){if (strcmp(token, "begin") == 0)return 1;else if (strcmp(token, "end") == 0)return 2;else if (strcmp(token, "integer") == 0)return 3;else if (strcmp(token, "if") == 0)return 4;else if (strcmp(token, "then") == 0)return 5;else if (strcmp(token, "else") == 0)return 6;else if (strcmp(token, "function") == 0) return 7;else if (strcmp(token, "read") == 0)return 8;else if (strcmp(token, "write") == 0)return 9;elsereturn 0;}/*返回标识符的对应种别*/int symbol(){return 10;}/*返回常数的对应种别*/int constant(){return 11;}/*按照格式输出单词符号和种别*/void output(const char* token, int kindNum){printf("%16s %2d\n", token, kindNum);}/*根据行号和错误码输出错误*/bool error(int lineNum, int errNum){char* errInfo;switch (errNum){case ILLEGAL_CHAR_ERR:errInfo = "出现字母表以外的非法字符";break;case UNKNOWN_OPERATOR_ERR:errInfo = "出现未知运算符";break;default:errInfo = "未知错误";}if (fprintf(stderr, "***LINE:%d %s\n", lineNum, errInfo) >= 0) return true;elsereturn false;}/*词法分析函数,每调用一次识别一个符号*/bool LexAnalyze(){static int lineNum = 1;char character;char token[17] = "";character = getnbc();switch (character){case'\n':output("EOLN", 24);lineNum++;break;case EOF:output("EOF", 25);return false;;if (fullName != NULL)strncpy(out, fullName + 1, strlen(fullName) - 1 - strlen(extension));elsestrncpy(out, in, strlen(in) - strlen(extension));}/*初始化函数,接收输入文件地址,并打开输入、输出、错误文件、将标准输入重定向到输入文件,将标准输出重定向到输出文件,标准错误重定向到错误文件*/bool init(int argc, char* argv[]){if (argc != 2){return false;}else{char* inFilename = argv[1];yd");rr");if (freopen(inFilename, "r", stdin) != NULL&&freopen(outFilename, "w", stdout) !=NULL&&freopen(errFilename, "w", stderr) != NULL)return true;elsereturn false;}}void main(int argc,char* argv[])//argv[1]是输入文件地址{if (init(argc,argv)){while (LexAnalyze()){}}fclose(stdin);fclose(stdout);fclose(stderr);return;}。
04-编译原理课程测试第四套卷(附解析)-编译原理试题-中国科技大学
Elist.place := t1 Elist.ndim := 2 Elist.array := A ,
Elist.place := x Elist.ndim := 1 Elist.array := A A [
E.place := x L.place := x L.offset := null x
7、 (a) 调用函数 m 把实在参数压栈后,将存放返回值的地址压栈,然后调用 f。f 在返回前,将结果送 到 m 提供的存放返回值的地址。 (b) m 要为 3 次 f 调用分配存放结果值的空间,并且这 3 次存放结果值的空间不重叠。在每次调用 f 时,将相应的存放返回值的地址压栈。 8、文件 file1.c 中,函数 func 的定义采用传统的方式,形式参数 f 的类型被提升到 double。函数原型中 该参数也声明成 double 类型,两者类型相同,因此没有错误。 而在文件 file2.c 中, 函数 func 的定义采用现在提倡的形式, 形式参数的类型就是 float, 不会提升。 它的类型和函数原型中声明的类型不相同,所以编译器会报告错误。 9、需要修改,增加虚方法表指针作为第一个域。.type f:f, @function
pushl %ebp movl%esp, %ebp subl $4, %esp movl8(%ebp), %eax movl12(%ebp), %edx movl%edx, -4(%ebp) movl-4(%ebp), %edx movl%edx, (%eax) leave ret .size f, .-f .globl m .type m, @function m: pushl %ebp movl%esp, %ebp subl $4, %esp movl$20, -4(%ebp) leal -4(%ebp), %eax pushl $10 pushl %eax callf addl $8, %esp leave ret .size m, .-m .section.note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.3.5 (Debian 1:3.3.5-13)" 8、 (5 分)把下面左边的文件 file1.c 提交给编译器,编译器没有报告任何错误。而把文件 file2.c 提交 给编译器,错误报告如下: file2.c: 2: error: conflicting types for ‘func’ file2.c: 1: error: previous declaration of ‘func’ 试分析原因。 (在这两个文件中,第 1 行都是函数 func 的原型,第 2 行都是函数 func 的定义,函数体为 空。 ) file1.c file2.c int func(double); int func(double); int func(f) float f; {} int func(float f) {} 9、 (5 分)教材上第 342 页倒数第 7 行说“将 C++语言中一个类的所有非静态属性构成一个 C 语言的结构 类型,取类的名字作为结构类型的名字” 。在这一章都学过后,你认为这句话需要修改吗?
西电编译原理_总复习
构造SLR(1)分析表的方法:
a J I A K
1.可移进项直接从DFA上看: action[I,a]:=sj goto[I,A]:=k 2.可归约项分两步走:若在I状态中有[A→α.], 首先计算:FOLLOW(A), 然后填写:action[I,b]:=Ri 其中:b∈FOLLOW(A)且A→α是第i个产生式。Βιβλιοθήκη ,三、计算题(3.3)
3.3(13分)已知一个NFA如图。 (a)(4 分 ) 用自然语言简要叙述该自动机所识别的语 言 的特点,列举两个它可识别的串。 (b)(3分)写出与该自动机等价的正规式r。 (c)(6分)用子集法构造识别r的最小DFA。
a,b 0 b 1 b
a,b 2
三、计算题(3.4)
3.4( 15 分)有文法 G 如下(注: G 中终结符 id 仅由单个英文字母 组成,如a, b等):E→E*T|T T→T+F|F F→(E)|id 和G的语法制导翻译如下:
E→E1*T | T T→T1+F | F F→(E) | id {E.place=newtemp; emit(*,E1.place,T.place,E.place;} {E.place=T.place;} {T.place=newtemp; emit(+,T1.place,F.place,T.place;} {T.place=F.place;} {F.place=E.place;} {F.place=;}
用自然语言给出下述正规式所描述的语言,并构造他们的最小DFA 10*1 (0|1)*011(0|1)*
问题:看得懂,但是不太会用自然语言较好的表达 说明:所谓用自然语言描述就是解释字符串的性质,一般情 况下是已经有了形式化描述。注意:这就是练习的目的。 解: 10*1:首尾是1中间有零或若干个0的01串。 (0|1)*011(0|1)* :至少含一个011的01串。 注意:绝对不允许用正规式形式表示,因为正规式已经给出
西电_编译原理上机报告
编译原理上机报告《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中的参考方案不同的是,对于数据库中的每一个表,我并不是把每个表的基本数据均存放在一个与数据库同名的基本数据文件中,而是为每个表创建一个与表同名的基本数据文件。
西安电子科技大学编译原理 (20)
(1) S→goto id {if 现 then
entry().type='未知'
-- 标识符第一次出
fill(entry(),'标号', '未定义', nextstat); emit('goto -'); entry().type ='标号' -- 已出现且是标号 then emit('goto', entry(id).addr); --addr有双重含义 if entry().def='未定义' -- 尚未定义,需要更新链头为最新序号 then fill(entry(),'标号','未定义',nextstat-1); end if; else error; -- 标识符已出现且类型不是标号,出错 end if;
end if;}
符号表: .name .type .def .addr Lab 标号 未定义 1
4.8 控制语句
goto lab; goto lab; lab: x := a+b; goto lab; 三地址码: (1) goto (2) goto 1
else if
(1) S→goto id {if 现 then
end if;}
符号表: .name .type .def .addr Lab 标号 未定义 2-1
4.8 控制语句
goto lab; goto lab; lab: x := a+b; goto lab; 三地址码: (1) goto (2) goto 1
(3) LAB→id ':' {if entry().type='未知' -- 标识符第一次出现 then fill(entry(), '标号', '已定义', nextstat); else if entry().type='标号' and entry().def='未定义' -- 还未定义出现 then q:=entry().addr; fill(entry(), '标号', '已定义', nextstat);--更新条目 backpatch(q, nextstat); else error; -- 其它情况均出错 end if; end if; }
西电软院编译原理试题
Xidian University Li Huan编译原理题目解诗云:太初有道,道曰全真。
全真七子,星聚软院1。
重阳归天2,分道七篇。
各执一篇,授业终南。
当是时也,正乃王道长献青真人讲道西电,秘授编译原理心法一篇,以飨众生。
无量寿佛!今晚 Li Huan1此处作者指的是目前西电软件学院七位有德道长:总掌教大护法武道长、首席副掌教顾道长、刘道长讳西洋、沈道长讳沛意、王道长讳献青、高道长讳海昌、陈道婆讳静玉。
此乃huan说,另有其他版本。
不再赘述。
2此处指软件学院开山祖师陈真人讳平。
归天意本离世,此处特指升仙为四大护校法尊之一。
1、填空题(30 分)1.1 以阶段划分的编译器中,语法分析阶段以记号流为输入,语义分析阶段以语法树为输入。
1.2 有正规式 P=a|b 和 Q=cd 则 L(QP)={cda,cdb} ,L((P|Q)Q)={acd,bcd,cdcd} 。
1.3 有两个因素使得有限自动机是不确定的,一个是具有ε 状态转移,另一个是对同一字符,可能有多于一个的下一状态转移。
1.4 词法分析器有四个作用,请给出其中的任意两个:识别记号并交给语法分析器/滤掉源程序中的无用成分/处理与具体平台有关的输入/调用符号表管理器或出错管理器。
1.5 一个定义正确的上下文无关文法,非终结符集合和终结符集合的交集为空,所有出现在产生式左部的文法符号均是非终结符,仅出现在产生式右部的文法符号均是终结符。
1.6 编译源程序的过程中,发现函数定义末尾缺少花括号,该情况是语法错误;发现除数为 0,该情况是语义错误。
1.7 推导 S=>?H=>?FTP =>?FTc=>?Fbc=>?abc 是最右/规范推导。
1.8 产生式 F→A*F|A 提取左因子的结果为 F->AF' F'->*F|ε 。
1.9 对于算术表达式 “a*b+c”,当采用预测分析方法时,接受格局中的“当前剩余输入”应该为空,初始格局中的“当前剩余输入”应该是 a*b+c 。
编译chapt4
电子科技大学计算机科学与工程学院
2015年5月22日
程序设计语言与编译 语法 ① 几个术语
字母表 : 语言允许使用字符的集合 , 其元素称为 字符;由字符组成的有限串(字符串)称为符 例如:26个大小写英文字母,10个 号。 数字,各种运算符号等等…… 字汇表:由符号组成的集合,其元素称为字 词法规则:规定什么样的字符串可以构成语言的 有效符号 例如:for,while,procedure等各 种关键字,标识符,数字串等等 语法规则 : 确定一个符号序列是否为一个句子 , 例如:标识符是由字母打头的字母 例如:算术表达式可以是单个的数 并提供句子的结构(什么样的符号序列是合法 / 数字串; 字串,标识符,或由两个算术表达 的) 式经过算术运算构成;
程序设计语言与编译
第四章 程序语言的设计
主要内容 1.语言的定义 语法 如何对高级语言给出明确的定 语义 义,以便语言的使用者和实现 定义语言是否合法的一组规则; 者,以及人和机器能无二义确 2.文法 用以规定程序或其成分的含 义 定程序是否有效,它的含义是 3.语言的设计 的规则; 定义语言语法的形式化规则; 什么;
程序设计语言与编译 第二节 文法
定义
文法G定义成一个四元式: G=(VT,VN,S,P) 其中 VT是非终结符的集合; VN是终结符的集合; SVN是开始符号; P是产生式的非空有限集; 注意:多个产生式 产生式一般写为 →1 ,其 *,V*, 中V*VN V → 2 V=VNVT …
电子科技大学计算机科学与工程学院
2015年5月22日
程序设计语言与编译
* ai-1 i-1 (i-1次使用第一个产生式 设文法S G=(V V* , S(PQ) ) T,V N,S,P),α,β * i-1 * ① 如果 S V*,则α为 G的一个句型; aiα,α bQ(PQ) (使用第二个产生式 ) 定义 ② 如果 * * S Q VT*,则α为 G的一个句子 aiα,α b(PQ)i-1 (i-1次使用第三个产生式 ) * 的所有句子的集合称为 aib2(QP)i-2Q2 (使用第四个产生式 ) ③ 文法 G G产生的语言,记 3(QP)i-3Q3 (i-2次使用第三个产生式) * G), aib即: 为L( * α,αV *} …… L(G)={α│S T i i i * a b Q nb|n0}; ibicQi-1 L(G) 例1:文法G={S→aS|b} 产生的语言 * a (={a 使用第五个产生式 ) 例2:G={S→aS│aP * aibici (i-1次使用第六个产生式) P→bP│bQ Q→cQ│c} 它产生语言L(G)={aibjck│i,j,k 0} 一个上下文相关文法 例3:G={S→aSPQ│abQ QP→PQ bP→bb bQ→bc cQ→cc} 它产生语言L(G)={ aibici│i1} 电子科技大学计算机科学与工程学院
西安电子科技大学《编译原理》.ppt
5)均是句型。句型是一个相当广泛的概念,根据定义3.3可知,α1
和α6同样也是句型。
11
3.2.3 推导、分析树与语法树
对于推导:E => -E => -(E) => -(E+E) => -(id+E) => -(id+id) 它产生句子的方式很不直观,看起来十分困难。
分析树是推导的图形表示,它的表示很直观,并且同时反映语
A→α,其中A∈N(左部),α∈(N∪T)*(右部), 若α=ε,则称A→ε为空产生式(也可以记为A →); (4) S是非终结符,称为文法的开始符号(Start symbol)。■
例3.2 简单算术表达式的上下文无关文法可表示如下:
N={E} T={+,*,(,),-,id} S=E
P: E → E + E
① 语法规则:上下文无关文法(子集-LL文法或LR文法) ② 语法分析:下推自动机(LL或LR分析器),自上而下和自下而 上分析 本章主要内容: <1> 与语法分析有关的基本概念和相关问题 <2> 上下文无关文法 <3> 自上而下分析 <4> 自下而上分析 <5> 上机作业-第二部分:函数绘图语言的语法分析器
分析树既反映了产生句型的推导过程,又反映了句型的结构。
13
3.2.3 推导、分析树与语法树(续2) 更多的情况下,仅关注句型结构,而忽略推导过程。
定义3.6 对CFG G的句型,表达式的语法树被定义为具有下述性质的
一棵树:
(1) 根与内部节点由表达式中的操作符标记;
(2) 叶子由表达式中的操作数标记;
1
3.1 语法分析的若干问题
编译原理第四章 语法分析—自上而下分析
国防科技大学计算机系602教研室
4.3.3 LL(1)分析条件
E→TE E→+TE | T→FT T→*FT | F→(E) | i
i + i
国防科技大学计算机系602教研室
E
i+i
IP
G(E): E→TE E→+TE | T→FT T→*FT | F→(E) | i
END
3. 化简由2所得的文法。去除那些从开始符号出发永 远无法到达的非终结符的产生规则。
国防科技大学计算机系602教研室
例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
令它的非终结符的排序为R、Q、S。 对于R,不存在直接左递归。 把R代入到Q的有关候选后,把Q的规则
变为 Q→Sab | ab | b
通 一常 步,或用若干1步,可n 以表推示出:从n。1出发,经过
*
用 1 n 表示:从1出发,经过0步或Leabharlann 若干步,可以推出n。*
所以 : 即 或
定义:假定G是一个文法,S 是它的开始符号。
如 号果的句S型 是*一个,句则子。称文是法一G个所句产型生。的仅句含子终的结全符
体是一个语言,将它记为 L(G)。
一个文法消除左递归的条件: 不含以为右部的产生式 不含回路。
PP
国防科技大学计算机系602教研室
消除左递归的算法:
1. 把文法G的所有非终结符按任一种顺序排列成P1, P2,…,Pn;按此顺序执行;
2. FOR i:=1 TO n DO
BEGIN FOR j:=1 TO i-1 DO
电子科技大学22春“计算机科学与技术”《计算机编译原理》期末考试高频考点版(带答案)试卷号4
电子科技大学22春“计算机科学与技术”《计算机编译原理》期末考试高频考点版(带答案)一.综合考核(共50题)1.词法分析器的输出是()。
A.单词符号B.源程序C.语法单位D.目标程序参考答案:A2.从功能上说,程序语言的语句大体可分为执行性语句和说明性语句两大类。
()A.正确B.错误参考答案:A3.描述文法符号语义的属性有()。
A.综合属性B.继承属性C.L-属性D.R-属性参考答案:AB4.语法分析程序主要功能是进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
()A.正确B.错误参考答案:B5.素短语是指至少含有一个终结符的短语,且除它自身之外不再含任何其他素短语。
()A.正确B.错误参考答案:A6.高级语言编译程序常用的语法分析方法中,递归下降分析法属于().分析方法。
A.自左至右B.自顶向下C.自底向上D.自右向左参考答案:B7.所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直至归约到文法的()。
A.开始符号B.终结符C.非终结符D.空字ε参考答案:A8.已知文法G[S]:S→AB|PQx,A→xy,B→bc,P→dP|ε,Q→aQ|ε,该文法是LL(1)文法。
()A.正确B.错误参考答案:B9.语法分析最常用的方法有()分析法。
A.自上而下B.自下而上C.从左向右参考答案:AB10.编译程序中语法分析器的输入是()。
A.单词B.表达式C.直接短语D.句柄参考答案:A11.常用的中间代码形式有()。
A.状态机B.四元式C.转换表D.语法树参考答案:B12.所谓语法制导翻译方法是为每个产生式配上一个翻译子程序,并在语法分析的同时执行这些子程序。
()A.正确B.错误参考答案:A13.后缀式是一种把运算量写在前面,把算符写在后面的表示表达式的方法。
()A.正确B.错误参考答案:AA.正确B.错误参考答案:A15.运行阶段的存储组织与管理是为了()。
①提高编译程序的运行速度②节省编译程序的存储空间③提高目标程序的运行速度④为运行阶段的存储分配做准备A.①③B.②③C.③④D.①④参考答案:C16.按所涉及的程序范围可分为哪几级优化?()A.局部优化B.循环优化C.全局优化D.回溯优化参考答案:ABC17.数组的内情向量中肯定不含有数组的()的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
先声明后引用原则 • 若过程定义出现在对它的引用之后或引用时看不到的地方,则 必须在调用前先声明该过程。 • 若引用前已出现定义,则声明可省略,因为定义已包括了声明。
10
4.5.3.1 左值与右值
直观上,出现在赋值号左边和右边的量分别称为 左值和右值; 如 C 语句: a = b 实质上,左值必须具有存储空间,右值可以仅是 一个值,而没有存储空间。 形象地讲,左值是容器,右值是内容。
4
<2> 变量声明的语法制导翻译(续1) T → array [num] of T (5)
此文法可以声明多维数组,如数组A的声明形式可以是: A : array [d1] of A2 : array [2] of array [d2] of array [3] of int ... array [dn] of int 此多维数组以行为主存储。 因为: 第一维是有d1个元素的一维数组, 每个元素又是一个n-1维的数组; 依此类推。
值调用的特点: 过程内部对参数的修改,不影响作为实参的变量原来的值。
14
值调用举例: program reference ( input, output); var a, b : integer;
<1> 值调用(续1)
procedure swap(x, y : integer); var temp : integer; begin temp:=x; x:=y; y:=temp end; begin a:=1; b:=2; swap(a, b); writeln('a=', a); writeln('b=', b) end. 运行结果: a=1 b=2
9
4.5.3 过程的定义与声明(续) 例:Ada过程 定义: procedure swap(x,y:in out integer) -- 规格说明 is -- 过程体开始 temp : integer; -- 体中的声明 begin temp := x; x := y; y := temp; -- 可执行语句 end swap; -- 过程体结束 声明与调用: procedure swap(x, y: in out integer); -- 过程声明 swap(a, b); -- 过程调用
15
<1> 值调用(续2)
等价的C++程序 // ---------- 值调用参数传递的演示程序 #include <iostream> using namespace std; void swap(int x, int y) { int temp; temp=x; x=y; y=temp; } void main () { int a = 1, b = 2; cout<<"before: a="<<a<<" b="<<b<<endl; swap(a, b); cout<<"after: a="<<a<<" b="<<b<<endl; } 执行该程序
4.5 声明语句的翻译
• 声明语句的作用是为可执行语句提供信息,以便于 其执行。 • 对声明语句的处理,主要是将所需要的信息正确地 填写进合理组织的符号表中。
1
4.5.1 变量的声明 <1> 变量的类型定义与声明
类型定义:为编译器提供存储空间大小的信息 变量声明:为变量分配存储空间 组合数据的类型定义和变量声明: 定义与声明在一起,定义与声明分离。
3
<2> 变量声明的语法制导翻译 (a) 变量声明的文法: D → D ; D (1) | id : T (2) T → int (3) | real (4) | array [num] of T (5) | ^T (6)
G4.5
产生式(5)是数组类型的声明,其中的数组元素个数由num 表示,如num可以是5或10等,这是一个简化了的表示方法,它 等价于1..5或1..10。 产生式(6)是指针类型的声明,其宽度(大小)是一个常量。 数组元素的类型和指针所指对象的类型可以是任意合法类型。
8
4.5.3 过程的定义与声明
1.过程(procedure): 过程头(做什么) + 过程体(怎么做); 函 数: 有返回值的过程 主程序: 被操作系统调用的过程/函数
2.过程的三种形式:过程定义、过程声明和过程调用。 过程定义:过程头+过程体; 过程声明:过程头;
• • 本节重点讨论过程的规格说明、过程体中的声明的处理 本节将过程定义和过程声明统称为过程声明。
13
<1> 值调用 实参的特点: 任何可以作为右值的对象均可作为实参 参数传递和过程内对参数的使用原则: 1. 过程定义时形参被当作局部量看待,并在过程内部为形 参分配存储单元; 2. 调用过程前,首先计算实参并将其值(实参的右值)放 入形参的存储单元; 3. 过程内部对形参单元中的数据直接访问。 调用时: 调用中: 定义时: 返回后: f(a,b)过程内 f(x,y)过程外 f(a,b)过程内 f(x,y)过程外 x 1 a ? x 1 a y 2 b ? y 2 b
12
4.5.3.2 参数传递
1. 形参与实参 • 声明时的参数称为形参(parameter或formal parameter) • 引用时的参数称为实参 (argument或actual parameter) 2. 常见的参数传递形式:(不同的语言提供不同的形式) • 值调用(call by value) • 引用调用(call by reference) • 复写-恢复(copy-in/copy-out) • 换名调用(call by name) 参数传递方法的本质区别: 实参是代表左值、右值、还是实参本身的正文。
运行结果: a=2 b=', b) b=1
18
<2> 引用调用(续2)
等价的C++程序 // ---------- 引用调用参数传递的演示程序 #include <iostream> using namespace std; void swap(int & x, int & y) { int temp; temp=x; x=y; y=temp; } void main () { int a = 1, b = 2; cout<<"before: a="<<a<<" b="<<b<<endl; swap(a, b); cout<<"after: a="<<a<<" b="<<b<<endl; } 执行该程序
16
<2> 引用调用
实参的特点:必须是左值。 参数传递和过程内对参数的使用原则: 1. 定义时形参被当作局部量看待,并在过程内部为形参 分配存储单元; 2. 调用过程前,将作为实参的变量的地址放进形参的存 储单元; 3. 过程内把形参单元中的数据当作地址,间接访问。
定义时: f(a,b)过程内 a b
5ห้องสมุดไป่ตู้
<2> 变量声明的语法制导翻译(续2) (b) 填写符号表信息的语法制导翻译
1. 全局量offset:记录当前符号存储地址(偏移量,初值设为0) 2. 属性.type和.width:变量的类型和所占据的存储空间大小 3. 过程enter(name, type, offset):为type类型的变量name 建立符号表条目,并为其分配存储空间(位置)offset 4. array(n,type)生成数组类型,pointer(type)生成指针类型 (1)D→D;D (2)D→id:T {enter(, T.type, offset); offset:=offset+T.width;} (3)T→int {T.type:=integer; T.width:=4;} (4)T→real {T.type:=real; T.width:=8;} (5)T→array [num] of T1 {T.type:=array(num.val, T1.type); T.width:=num.val*T1.width;} (6)T→^T1 {T.type:=pointer(T1.type); T.width:=4;}
调用时: f(x,y)过程外 x 1 y 2
调用中: f(a,b)过程内 a &x 3 b &y 5
返回后: f(x,y)过程外 x 3 y 5
引用调用的特点: 过程内部对形参的修改,实质上是对实参的修改。
17
引用调用举例: 值调用举例: program reference ( input, output); var a, b : integer;
11
4.5.3.1 左值与右值
(1) (2) (3) const two = 2; -- 声明一个值为2的常量two x : integer; -- 声明一个类型为整型数的变量x function max(a, b : integer) return integer; -- 声明一个返回值类型是整型数的函数max (4) x := two; -- 赋值句执行后,x当前值为2 (5) x := two + x; -- 赋值句执行后,x当前值变为4 (6) x := max(two,x)+x; -- 赋值句执行后,x当前值变为8 (7) 4 := x; -- 字面量不能作为左值 (8) two := x; -- 常量不能作为左值 (9) max(two,x) := two; -- 函数返回值不能作为左值 (10) x+two := x+two; -- 表达式的值不能作为左值