编译原理第二章

上下文无关文法

该文法由四个元素组成。
1、一个终结符号集合,(有时也称为词法单元)
2、一个非终结符合集合,(有时称为语法变量)
3、产生式集合,其中包含一个称为产生式头或左部的非终结符号,一个箭头,和一个称为产生式体或右部的有终结符号和非终结符号组成的序列。
4、指定一个非终结符合为开始符号

词法单元
词法单元由两个部分组成:名字和属性

参数列表文法:
call -> id ( optparams)
optparams -> params | ε
params -> params,params | params

语法分析

给定一个上下文无关文法,该文法的一颗语法分析树具有一下性质:
1、根节点的标号为文法的开始符合。
2、每个叶子节点的内部节点为一个终结符号或ε
3、每个内部节点的标号为非终结符号
4、如果非终结符号A是某个内部节点的标号,并且他的子节点的标号从左至有分别为x1,x2……,Xn,那么比如存在产生式A -> x1x2……Xn。其中x1……Xn,可以是终结符号也可以是非终结符号。

一个文法的语言的另一个定义是值能够由某颗语法分析树生成的符号串的集合。为一个给定的终结符号串构建一颗语法分析树的过程称为对该符号串进行语法分析。

二义性

一个文法可能有多颗语法分析树能够生成同一个给定的终结符号串,这样的文法称为二义性文法。

运算符的结合性

当一个运算分量的左右两侧都有运算符时,我们需要一些规则确定该运算符被应用与那个分量。“+”是左结合的,因为当一个运算分量左右两边都有“+”是,他属于左边的运算符。(“ +,-,*,/ ”都是左结合的,“^,=,+=,-=”是右结合的)。

运算符的优先级

在这里插入图片描述
在由factory构造语法分析树的过程中,先产生±符号,在产生*/符号,在计算分析树的结果时,由叶节点向根节点计算,就会先计算乘除后计算加减。
在这里插入图片描述
分号放置的位置,避免在if和while语句之后出现多余的分号。当嵌套字句是一个赋值语句或do while语句时,分号作为子语句的一部分被生成。

语法制导翻译

语法制导翻译是通过向一个文法的产生式附加一些规则或程序片段而得到的。

属性:属性表示与某个程序构造相关的任意的量。
翻译方案:是一种将程序片段附加到一个文法产生式上的表示法。当语法分析的过程中使用一个产生式相应的程序片段就会执行,这些程序片段的执行效果按照语法分析的过程顺序组合起来,得到的结果就是这次分析/综合过程处理源程序的得到的翻译结果。
语义动作:被嵌入到产生式体中的程序片段。

后缀表示

一个表达式E的后缀表示是可以按照下面的方法进行归纳定义:
1、如果E是一个常量或变量,则E的后缀表示是其本身
2、如果E是一个形如E1 op E2的表达式,其中 op 是一个二目运算符,那么E的后缀表示就是E1’ E2’ op这里的E1’ E2’是E1,E2的后缀表示。
3、如果E是一个形如(E1)的被括号括起来的表达式,则E的后缀就是E1的后缀表示。

综合属性

如果一颗语法分析树的各个节点上标记了相应的属性值,那么这课语法分析树就成为注释语法分析树。
如果某个属性在语法分析树节点N上的值是由N的子节点以及N本身的属性值确定的,那么这个属性就被称为综合属性,综合属性具有一个很好的性质:只需要对语法分析树进行一次自底向上的变历就可以计算出所有属性的值。
继承属性在某个语法分析树节点上的值是由语法分析树中该结点本身、父节点以及兄弟节点上的属性值决定的。

语法分析

语法分析是决定如何使用一个文法生成一个终结符号串的过程。一般有两类:自顶向下和自底向上。

输入中当前被扫描的终结符号通常称为向前看符号。

预测分析法

递归下降分析方法是一种自顶向下的语法分析方法,他使用一组递归过程来处理输入。在预测分析法中,每个非终结符号对应过程中的控制流可以由向前看符号无二义的确定。
在这里插入图片描述
FIRST(a)定义为可以由a生成的一个或多个终结符号串的第一个符号的集合。
预测分析器在没有其他产生式可用是,将ε产生式作为默认选择使用。
一个预测分析器程序由各个非终结符号对应的过程组成。对应于非终结符A的检查过程完成以下两项任务:
1、检查向前看符号,决定使用A的那个产生式
2、模拟被选中的产生式的体。也就是从最左边开始逐个执行此产生式体的非终结符号对应的匹配方法。

左递归

递归下降的语法分析器出现左递归时可能会陷入无限循环。
expr -> expr + term。
因为产生式体的开头时expr,所以expr对应的过程将被递归调用。

简单语法表达式的实现

https://editor.csdn.net/md/?articleId=105275124实现在另一篇博客,点击传送

词法分析

词法分析就是从输入中读取字符,并组成词法单元对象,并填充符号表。
构成一个词法单元的输入字符序列称为词数

剔除空白和注释

大部分语言允许词法单元之间出现任意数量的空白。在语法分析过程中会忽略源程序中的注释所以注释也当作空白处理。

在这里插入图片描述
本节中词法分析器的不变式断言如下:当词法分析器返回一个词法单元时,变量peek要么保存了当前词法单元的词素后的那个元素,要么保存空白字符。

常量

任何运行出现数位的地方都应该允许出现任意的整型常量。
对整数的词法分析:
在这里插入图片描述

识别关键字和标识符

在这里插入图片描述

符号表

符号表是一种供编译器用于保存有关源程序各种信息的数据结构。
每个带有声明的程序块都会有自己的符号表,这个块中的每个声明都在此符号表中有一个对应的条目。
符号表是在分析阶段由词法分析器、语法分析器、语义分析器、创建并使用的
在这里插入图片描述

静态检查

静态检查是指在编译过程中完成各种一致性检查。静态检查包括:
语法检查:语法要求比文法的要求更多。
类型检查:确保一个运算符或函数被应用到类型和数量都正确的运算分量上。
一个简单的静态检查:
左值和右值:确保左边可以被赋值,右边是值。(例如左边不可以是2这种常量)。

三地址码

三地址代码形如一下指令组成的序列:
x = y op z;
其中x,y,z可以是名字、常量、或编译器生成的临时变量;而op表示一个运算符。
数组由下面两种变体指令来处理:
x [y] = z。
x = y[z]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值