【编译原理】期末复习——哈工大

目录

**程序编译的总框架:

简答题

**编译原理的前端和后端分别有哪些阶段组成?

编译程序的五个阶段及其作用

程序编译的三大模块分类

**解释器和编译器的区别

**文法的形式化定义

推导和规约

**句型、句子和语言的含义

**短语、素短语、直接短语、句柄的含义

最左推导与最右推导

文法的二义性

规范规约的含义

字的前缀和活前缀的含义

LR(0)项目的分类

属性和语义规则的定义

**综合属性、继承属性和固有属性的含义

**S属性和L属性的定义

语义规则和翻译模式

四种参数传递方式

代码优化分类

**常用的代码优化方法

**局部性原理的概念

**给出C语言的活动记录格式

代码生成器输出的三种形式

什么是窥孔优化?列出几种窥孔优化的技术

另外

符号表的作用

计算题

正则文法和正则表达式之间的转化

如何求FIRST集合和FOLLOW集合

判断文法是否是LL(1)文法

LL(1)分析法中分析表的构造和预测分析示例

LR(0)分析表和SLR(1)分析表

逆波兰式

三地址码

抽象语法树(DAG有向无环图)

中间代码表示形式示例

中间代码生成

补充

字母表和字符

预测分析中错误的处理

算符优先文法

基于属性文法的处理方法

建立翻译模式

消除翻译模式中的左递归

百度网盘获取pdf版本:

链接:链接
提取码:WHY6


**程序编译的总框架:

简答题

**编译原理的前端和后端分别有哪些阶段组成?

图示:

编译前端:与源语言有关,如词法分析,语法分析,语义分析与中间代码产生,与机器无关的优化,出错管理,符号管理

编译后端与目标机有关,与目标机有关的优化,目标代码产生

目的:增加可移植性

前端和后端都包含优化过程

编译程序的五个阶段及其作用

  1. 词法分析:从左到右扫描组成源程序的字符串,并将其转换成单词串
  2. 语法分析:按照文法的产生式(语言的语法规则),识别输入符号串是否为一个句子(合式程序)
  3. 语义分析(语法制导翻译)与中间代码生成:分析由语法分析器识别出来的语法成分的语义,语义分析通常以中间代码形式表达操作
  4. 代码优化:对中间代码进行优化处理,使程序运行能够尽量节省存储空间,更有效地利用机器资源,使得程序的运行速度更快,效率更高
  5. 目标代码生成:为中间代码中出现的运算对象分配存储单元、寄存器等;将中间代码转换成目标机上的机器指令代码或汇编代码

程序编译的三大模块分类

**解释器和编译器的区别

解释器:把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序

编译器:把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序

**文法的形式化定义

推导和规约

3f95a6ee42e1baee95d4f69cb4a6524f.png

补充:多步推导/规约

(规约同理)

**句型、句子和语言的含义

句子一定是句型,但句型不一定是句子

**短语、素短语、直接短语、句柄的含义

参考:

编译原理 —— 短语、直接短语、素短语和句柄_starter_zheng的博客-CSDN博客_直接短语

要知道含义,并且会求

最左推导与最右推导

最左推导:每次推导都施加在句型的最左边的语法变量上。——与最右归约对应

最右推导:每次推导都施加在句型最右边的语法变量上。——与最左归约(规范规约

示例:

对于文法:

句子id + id * id的推导:

最左推导:

22c3255c04a107cb56814ce727d6033a.png

最右推导:

1bad4cafdb1f72c6e064d6f804b094fc.png

最左规约:

最右规约:

文法的二义性

如果一个文法的句子存在两棵分析树,那么该句子是二义性的。

如果一个文法包含二义性的句子,则称这个文法是二义性的; 否则,该文法是无二义性的

规范规约的含义

9dd541d2de2844834383d7918defbf8e.png

字的前缀和活前缀的含义

规范归约过程中,保证分析栈中总是活前缀,就说明分析采取的移进/归约动作是正确的

LR(0)项目的分类

属性和语义规则的定义

属性是与文法符号相关联的语义信息

语义规则是与产生式相关联的语义动作

**综合属性、继承属性和固有属性的含义

综合属性:节点的属性值是通过分析树中该节点或其子节点的属性值计算出来的

继承属性:节点的属性值是由该节点、其兄弟节点或父节点的属性值计算出来的

固有属性:通过词法分析直接得到的属性

**S属性和L属性的定义

S-属性:只含综合属性的语法制导定义称为S-属性定义,S-属性文法适合一遍扫描的自下而上分析

L-属性:一个语法制导定义被称为L-属性定义,当且仅当它的每个属性或者是综合属性,或者是满足如下条件的继承属性:

L-属性文法适合一遍扫描的自上而下分析

S-属性文法一定是L-属性文法

语义规则和翻译模式

图示:

四种参数传递方式

  1. 传值
  2. 传地址
  3. 传值结果
  4. 传名

举例:

代码优化分类

  1. 机器相关性:分为机器相关优化(寄存器优化,多处理器优化,特殊指令优化,无用指令消除等)和机器无关优化
  2. 优化范围:分为局部优化和全局优化
  3. 优化语言级:分为:针对中间代码和针对机器语言。

**常用的代码优化方法

①公共子表达式删除:用先前的计算结果替换公共子表达式的本次出现

如果表达式E在某次出现之前已经被计算过,并且E中变量的值从那次计算到本次出现之间未被改变过,则E的本次出现称为公共子表达式

②复制传播:

③无用代码删除:无用代码是指计算结果以后不被引用的语句

④代码外提:

⑤强度削弱:用计算较快的运算代替较慢的运算

例如:

**局部性原理的概念

程序中的大部分运行时间都花费在较少的一部分代码中,而且只是涉及到一小部分数据。时间局部性:如果某个程序访问的内存位置有可能在很短的时间内被再次访问空间局部性:如果被访问过的内存位置的邻近位置有可能在很短的时间内被再次访问

**给出C语言的活动记录格式

过程的每个活动所需要的信息用一块连续的存储区来管理,这块存储区叫做活动记录

非嵌套语言(如C语言)的活动记录格式如下:

sp:指向当前过程的活动记录在栈中的起始位置

top:指向栈顶

形式单元:存储形参

简单变量:存储过程内部定义的变量

旧SP:指的是上一条活动记录的SP的位置

补充:嵌套语言(如PASCAL)的活动记录的基本格式:

代码生成器输出的三种形式

  1. 绝对机器语言代码
  2. 可重定位的机器语言代码
  3. 汇编语言代码

什么是窥孔优化?列出几种窥孔优化的技术

窥孔优化是一种简单有效的局部优化方法,它通过检查目标指令中称为窥孔的短序列,用更小更短的指令序列进行等价代替,以此来提高目标代码的质量

  1. 冗余指令消除
  2. 不可达代码消除
  3. 强度削弱
  4. 特殊机器指令的使用

另外

符号表的作用

计算题

正则文法和正则表达式之间的转化

1.正则文法——正则表达式:

例题:

2.正则表达式——正则文法

3.正则表达式——状态转换图

例:

例题:

如何求FIRST集合和FOLLOW集合

FIRST集合

FOLLOW集合:

c8887e593a16d1fd16b78e9dd2edb8b4.png

示例:

判断文法是否是LL(1)文法

LL(1)分析法中分析表的构造和预测分析示例

c2c28399aa8c038dbb4a90f4a68bd234.png

LR(0)分析表和SLR(1)分析表

移进规约冲突:

比较:8027e1c898ead03757765967ab0e921a.png

逆波兰式

三地址码

四元式:

三元式:

抽象语法树(DAG有向无环图)

可以消除公共子表达式,具有公共子表达式的节点具有多个父节点

中间代码表示形式示例bb9581e9a480690c0bd1058ad4a99195.png

中间代码生成

一遍扫描:通过单遍扫描为布尔表达式和控制流语句生成代码

回填:

用到的函数:7dca122ae383439723daaa1ed7653969.png

布尔表达式回填式翻译

or:

nextquad 指向下一条将要产生的但是没有产生的四元式的地址,初值为1,每当执行一次emit,就自增1

and:851a856ad302ded35b805e4ec761babb.png

not ()

运算符(<,>)bd242c6d1b7d8a01876aec3a80c75167.png

true false:

例题:434dcab6fc05b54728b1c2caaafdb6db.png

常见控制结构的回填式翻译

总体:

if-then:d9b50b53980dd5815950c3bd851f122c.png

if-then-else

while:

语句序列:

例题:c35e3b23001cdbb9b81fb36d0926fd6b.png

while a<b do:
	if c<5 then:
    	while x>y do:
        	z := x+1
    else
        x := y

补充

字母表和字符ca2d7245bf9723e3c6a5b27bf77bbc7c.png

2c5c97ee4d2b5fe4036c121b65cce946.png587ccfe493c4bd6fa905597882510354.png预测分析中错误的处理

c56f89479c320bf93aff2fc510eea8c2.png29df09a6fa6065c2f2ea23ed33e0b936.png908fb6538b8020f0d121d32d14ce7656.png8454265a4fb0e34b99411fa3f9676ffd.png算符优先文法

①构造FIRSTVT集合065be69fd152ee307a9c7adabf9813ca.png

例:

②构造LASTVT集合7672c85de0b2fcfb016189e717dc33d6.png

例:

③根据FIRSTVT和LASTVT集合构造优先关系表

算法:0a90ffb415bc7eb227381701a656edd6.png例:

简单来说,就是对于一个终结符,其算符优先级小于其右边第一个终结符的FIRSTVT集合中的算符,而其左边第一个终结符的LASTVT集合中的算符的优先级都大于它

在优先关系表中,竖着的一列代表左侧的字符,横着的一行代表右侧的字符

④进行算符优先分析:

栈中顶部的终结符与输入串的当前符号比较(不用管栈中的非终结符),如果当前符号的优先级高,则将当前符号压入栈中,如果栈顶终结符的优先级高,则对栈中内容进行一次规约,如图所示

原因是算符优先分析省略了中间过程中单个非终结符到单个非终结符的规约

基于属性文法的处理方法

1.依赖图

2.树遍历

3.一遍扫描

(建立抽象语法树AST)

18554e24766617093539f29a0bcacd62.png

建立翻译模式

翻译模式示例:

建立翻译模式的方法:7f5313316ebc90102f3fa48be23644b8.png

也就是说,不将语义规则插入到产生式中

消除翻译模式中的左递归

示例:931bbc3aaa78546f429fce0170e840bd.png重点在于何处理消除左递归后的翻译模式,

基本方法如下:72ab3ab2e30118f6dc700872d53a2a5a.png

原先的文法推导的结果是XY.......Y,引入R来消除左递归,本质上就是用R的迭代来生成若干个Y;

消除左递归后构造抽象语法树:

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
语法分析是编译原理中的重要部分,它的作用是将词法分析阶段得到的词法单元序列转换成抽象语法树(AST)或语法分析树(Parse Tree),以便于后续的语义分析、中间代码生成和目标代码生成等环节的进行。在本次实验中,我们将使用Java语言实现一个简单的语法分析器。 实验要求: 1. 实现自顶向下的递归下降分析器。 2. 支持的文法如下: ``` <program> ::= <stmts_list> <stmts_list> ::= <stmt> | <stmts_list> <stmt> <stmt> ::= <if_stmt> | <while_stmt> | <assign_stmt> <if_stmt> ::= if <condition> then <stmts_list> end <while_stmt> ::= while <condition> do <stmts_list> end <assign_stmt> ::= <id> = <expr> <condition> ::= <expr> <relop> <expr> <expr> ::= <term> | <expr> <addop> <term> <term> ::= <factor> | <term> <mulop> <factor> <factor> ::= <id> | <number> | '(' <expr> ')' <relop> ::= '<' | '>' | '=' | '<=' | '>=' | '<>' <addop> ::= '+' | '-' <mulop> ::= '*' | '/' <id> ::= <letter> | <id> <letter> | <id> <digit> <number> ::= <digit> | <number> <digit> <letter> ::= A | B | ... | Z | a | b | ... | z <digit> ::= 0 | 1 | ... | 9 ``` 注意:文法中的关键字 if、then、end、while、do、and 等均为保留字。 3. 实现的语法分析器应具备以下功能: - 能够识别出语法正确的程序,并输出相应的语法分析树或抽象语法树。 - 能够识别出语法错误的程序,并给出相应的错误提示信息。 - 能够处理注释和空格等无意义的字符。 4. 实验提交要求: - 实验报告,包括程序设计和实验结果分析。 - 程序源代码。 实验设计思路: 1. 根据给定的文法,设计语法分析器的语法规则和对应的产生式。 2. 编写相应的Java代码,将文法转换为递归下降分析器所需要的形式。 3. 实现从输入的源代码中读取词法单元序列的功能。 4. 实现递归下降分析器的核心算法,对输入的词法单元序列进行语法分析,并构建相应的语法分析树或抽象语法树。 5. 在语法分析过程中,需要处理注释和空格等无意义的字符,以便于正确识别语法错误。 6. 在语法分析过程中,需要对输入的源代码进行错误检查,并给出相应的错误提示信息。 7. 输出语法分析树或抽象语法树,以便于后续的语义分析、中间代码生成和目标代码生成等环节的进行。 实验结果分析: 经过实验测试,我们的语法分析器能够正确地识别出合法的程序,并输出相应的语法分析树或抽象语法树。同时,它也能够正确地识别出语法错误的程序,并给出相应的错误提示信息。总的来说,本次实验取得了较好的实验效果。 实验源代码: 见下方代码框:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THE WHY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值