编译原理ppt
- 格式:ppt
- 大小:1.22 MB
- 文档页数:74


对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、 代码生成)报告的。
(1) else 没有匹配的 if 语法分析
(2) 数组下标越界 语义分析
(3) 使用的函数没有定义 语法分析
(4) 在数中出现非数字字符 词法分析
一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组产生式。
词法分析器用于识别单词
LL(1)分析法属于自顶向下的语法分析方法
算符优先分析算法是自下而上的语法分析方法
编译程序与解释程序最大的区别之一在于前者生成目标代码,而后者不生成
下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符 说明
\ 转义符
(), (?:), (?=), [] 括号和中括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列
| 替换
一个上下文无关文法是LL(1)文法的充分必要条件是:
对每个非终结符A的两个不同产生式,A→α, A→β,满足
SELECT(A→α)∩SELECT(A→β)=空
其中α,β不同时能ε
如果S* αAβ and A
+γ,则称γ是句型αγβ的相对于变量A的短语(Phrase)
如果S* αAβ and Aγ,则称γ是句型αγβ的相对于变量A的直接(简单)短语
最左直接短语叫做句柄(Handle)
前端:与目标代码无关的部分,包括词法分析、词法分析、语义分析,以及相关的错误处理和符号表的建立
后端:与目标代码相关的部分,主要包括代码优化、代码生成和相关错误处理。
0型(短语文法,图灵机):
产生式形如:
其中: (VT VN)*且至少含有一个非终结符; (VT VN)*
1型(上下文有关文法,线性界限自动机):
(1) 简述规范归约的基本思想。(第五章课件第5张)
用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
(2) 阐述编译程序各个组成部分主要完成的工作。(课本P2~P4)
词法分析的任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词。
语法分析:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位。
语义分析与中间代码产生:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译。
优化:在于对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效的目标代码。
目标代码生成:把中间代码变换成特定机器上的低级语言代码。
(3) 什么是编译器的前端和后端,这样划分有何意义?(课本P7)
编译器粗略分为
词法分析,语法分析,类型检查,中间代码生成,
代码优化,目标代码生成,目标代码优化。
把中间代码生成及之前阶段划分问编译器的前端,那么后端与前端是独立的。后端只需要一种中间代码表示,可以是三地址代码或四元式等,而这些都与前端生成的方式无关。也就是不论你前端是用fortran还是c/c++,只要生成了中间代码表示就可以了,后端是不管你是用哪种语言生成的。
(4) 乔姆斯基把文法分为哪几种类型?对这几种类型文法作简要说明。(课本P34)
把文法分成四种类型:0,1,2,3型。与上下文无关文法一样,它们都由四部分组成,但对产生式的限制有所不同。
0型(短语文法,图灵机):产生式形如: 其中: (VT VN)*且至少含有一个非终结符; (VT
VN)*
1型(上下文有关文法,线性界限自动机):产生式形如: 其中:|| ||。仅 S 例外,但此时S不得出现在任何产生式的右部。
2型(上下文无关文法,非确定下推自动机):产生式形如: A 其中:A VN; (VT VN)*。
《编译原理》课程
实验报告(临时)
题目
专业
班级
学号
姓名
指导教师
华东理工大学软件与管理信息学院
2006年9月22日
一.实验题目
二.实验成员
组长名字写在第一个,每个同学完成的基本任务是什么。
三.实验内容
本学期的编译实验内容是使用编译构造工具实现一个扩充PL0语言的编译器。
扩充PL0语言是在PL0语言的基础上增加对整型一维数组的支持、扩充IF-THEN-ELSE条件语句、增加REPEAT语句、支持带参数的过程和增加注释,如下所示:
(1)整型一维数组,数组的定义格式为:
VAR (:)
其中上界和下界可以是整数或者常量标识名。
访问数组元素的时候,数组下标是整型的表达式,包括整数、常量或者变量和它们的组合。例如,假设a是常量,b是整型变量,c是数组,这些访问方式都应该可以使用:c(1),c(a),c(b),c(b+c(1))。
(2)扩充条件语句,格式为:
::= IF THEN [ELSE ]
(3)增加REPEAT语句,格式为:
::= REPEAT UNTIL
(4) 支持带参数(传值参数)的过程,定义和调用形式如下:
::= PROCEDURE [‘(’{, }‘)’] ;
::= CALL [‘(’ {, }‘)’] (5) 注释
单行注释以 { 开始,以 } 结束,注释内容不包括 {和 }.
完整的扩充PL0语言的EBNF范式见实验提供的文档所示。下文所说的PL0语言,如果不加说明,就是特指扩充PL0语言。
本实验实现的PL0语言编译器,输入是PL0源语言程序,输出是一个栈式机的汇编语言(PCODE)程序,然后解释执行。如图1所示。
1. 编译过程概述:
编译过程划分为词法分析,语法分析,语义分析,中间代码生成,代码优化和目标代码生成;
1) 词法分析:是从左到右一个字符一个字符读入源程序,对构成源程序的字符流进行扫描和分析,从而识别出一个个单词;
2) 语法分析:是在词法分析的基础上将单词序列分解成各类语法短语;
3) 语义分析:审查源程序有无语义错误;为代码生成阶段收集信息;
4) 中间代码生成:将程序变成一种内部表示形式;
5) 代码优化:对中间代码进行变换或进行改造;
6) 目标代码生成:把中间代码变换成特定机器上的绝对指令代码或汇编指令代码;
2. 编译过程是一个语言处理程序;它把一个高级语言程序翻译成某个机器的汇编或二进制代码程序。
3. 一个程序设计语言的完整定义应包括语法和语义两个方面;
4. 符号串: 有字母表的符号组成的任何有穷序列;
5. 符号串的方幂:设X是符号串,把X自身连接N次得到的符号串Z。Z为X的方幂。
6. 符号串集合 , 闭包 ,正闭包。
7. 若一个文法存在某个句子对应两棵不同的语法树;则说这个文法是二义的。
8. 语法分析的作用是识别由词法分析给出的单词符号序列是否是给定文法的正确句子;目前语法分析常用的方法::自顶向下分析;自底向上分析。
9. 预测分析方法是自顶向下分析:一个预测分析器由三个部分组成
1) 预测分析程序
2) 先进后出栈
3) 预测分析表
10. 确定的有穷自动机(DFA)与不确定的有穷自动机的异同点;
相同点:其中K都是一个有穷集,它的每个元素称为一个状态;
E都是一个有穷字母表;它的每个元素称为一个输入字符;
是一个终态集;
不同点:DFA:f是转换函数,是K*E→K上的映像;
NFA:f是一个从K*E→K的子集的映像;
其实DFA是NFA的特例,对于每个NFA M,存在一个DFA M’使得L(M)=L(M‘)。