编译原理-语法分析


在这里插入图片描述

一.基本概念

1.语法分析器的两个重要作用

1.根据词法分析器提供的记号流,为语法正确的输入构造分析树(或语法树),这是本章的重点,在以后各节中详细讨论;
2.检查输入中的语法(可能包括词法)错误,并调用出错处理器进行适当处理,下边简单介绍语法错误处理的基本原则,而在以后的讨论中忽略此问题。

2.语法错误的处理和错误类型

在这里插入图片描述

对语法错误的处理,一般希望达到以下基本目标:
  1. 清楚而准确地报告错误的出现,地点正确、不漏报、不错报也不多报;
  2. 迅速从每个错误中恢复过来(以便分析继续进行);
  3. 不应使对语法正确源程序的分析速度降低太多。
3.语法错误的基本恢复策略

在这里插入图片描述

二.上下文无关文法CFG

1.定义

在这里插入图片描述

注意:CFG中 越靠近根节点的运算符优先级越低
结合性:

文法1:term-> term+factor|factor

文法2:term->factor+term

|factor

文法1中‘+’是左结合的,文法2中‘+’是右结合的。

文法1中term = ( term + factor1) + factor2是符合的,其中factor1和前一个+号结合,所以该运算符‘+’是左结合的

文法2中term = factor1 + ( factor2 + term)是符合的,其中factor2和后一个+号结合,所以该运算符‘+’是右结合的

2.表示形式

在这里插入图片描述

3.推导

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

语法分析树

在这里插入图片描述

三. 二义性与二义性的消除

在这里插入图片描述

二义性的定义

在这里插入图片描述
在这里插入图片描述

两种方法
1:改写为非二义性文法

新引入的非终结符,限制了每一步直接推导均有唯一选择;
最终分析树的形状,仅与文法有关,而与推导方法无关;
非终结符的引入,增加了推导步骤(分析树增高);
越接近S的文法符号的优先级越低。(如E→E+T)。
对于A→αAβ,若A在终结符左边出现(即终结符在β中),则A产生式具有左结合性质。

改写二义文法的关键步骤:

引入一个新的非终结符,增加一个子结构并提高一级优先级;
递归非终结符在终结符左边,运算具有左结合性,否则具有右结合性。
在这里插入图片描述
基本套路:
第一层E对应+操作
考虑到展开 E+T 式子中可能没有+操作 因此 |T E要能直接推导出T
同理 T=>T*F|F 注意+ * 为左结合
对于F右递归 由于()内式子可任意展开 ()可能出现在任何一步 F=>(E)
因为E可=>T=>F

2:为文法符号规定优先级和结合性

在这里插入图片描述

四.正规式到CFG

在这里插入图片描述
由mov函数写出初始CFG
然后简化

五.上下文有关语言

在这里插入图片描述
在这里插入图片描述
L3={anbncn|n≥1} CSL 上下文有关文法
L3’={ambmcn|m,n≥1} CFL 上下文无关文法
L3’’={akbmcn|k,m,n≥1}正规集
在这里插入图片描述

六.左递归的消除

在这里插入图片描述

消除直接左递归

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
A→ Aα1|Aα2|…|Aαm|β1|β2|…|βn
其中αi非空,βj均不以A开始。然后用下述产生式代替A产生式:
A → β1 A’ |β2 A’ | …|βn A’
A’→ α1 A’ | α2 A’ | … | αm A’ |ε

例题:

在这里插入图片描述
在这里插入图片描述

注意合理排序可简化产生式,不同排序的结果也不相同,但他们都是等价的,为了简化起见,一般排序由后向前(将最终的直接左递归放在产生式上)这样方便删除不需要的非终结符。

七.消除回溯(提取左因子)

在这里插入图片描述
注意:该过程类似于提取公因式
在这里插入图片描述

构造预测分析表

在这里插入图片描述
在这里插入图片描述

First集合(终结首符集)

First集合求法:
(1)如果X是终结符,则FIRST(X) = { X } 。
(2)如果X是非终结符,且有产生式形如X → a…,则FIRST( X ) = { a }。
(3) 如果X是非终结符,且有产生式形如X → ABCdEF…(A、B、C均属于非终结符且包含 ε,d为终结符),需要把FIRST( A )、FIRST( B )、FIRST( C )、FIRST( d )加入到 FIRST( X ) 中。
(4)如果X经过一步或多步推导出空字符ε,将ε加入FIRST( X )。

注意:当如A不包含空串时即,由A一定可以推出一个非空含终结符开头的串,将FirstA加入后结束循环

FOLLOW集合

定义
对于非终结符号A,FOLLOW(A) 被定义为可能在某些句型中紧跟在A右边的终结符号集合。
在这里插入图片描述
规则
计算文法符号 X 的 FOLLOW(X) ,不断运用以下规则直到没有新终结符号可以被加入任意FOLLOW集合为止 :

(1)将 加 入 到 F O L L O W ( X ) 中 , 其 中 S 是 开 始 符 号 , 而 加入到FOLLOW(X)中,其中S是开始符号,而 FOLLOW(X)S是输出右端的结束标记。

(2)如果存在一个产生式S->αXβ,那么将集合FIRST(β)中除ε外的所有元素加入到FOLLOW(X)当中。

(3)如果存在一个产生式 S->αX , 或者S->αXβ且FIRST(β)中包含ε , 那么将集合FOLLOW(S)中的所有元素加入到集合FOLLOW(X)中。
注意:FOLLOW集合是随符集,一般开始集为#
FOLLOW集合中不含空串

预测分析表的构造

在这里插入图片描述
首先从First集合出发 对于b 它在FirstC中 C—>b
b加入M[C,b]
对于e它在FirstS‘中 且推导出e的为First(eS) eS加M[S’,e]
由于空串在FirstS’中 将空串填入对应followS’的表项下、
如果 有 X=>TF F=>(X) 为连续的产生式不含| First(X)中的(来源于对F的推导
表项中填写的仍为X的展开式

八.LL(1)文法

在这里插入图片描述

证明:

在这里插入图片描述

判断是否为LL1文法

1.看表,一个空格内不能有两个候选项展开式
2.利用推论
1.对任何终结符a,α和β不能同时推导出以a开始的串;
2.α和β最多有一个可以推导出ε;
3.若β=*>ε,则α不能导出以FOLLOW(A)中终结符开始的任何串。
解释:
1.对于产生式任意 A=>B|C|D
任意两候选式first(B)和First(C)不能有交集
或者说含左因子
2.不能同时可推导出空串
3.first和Follow不能相交

预测分析器

在这里插入图片描述
在这里插入图片描述
模拟最左推导,查表将展开式反向压栈,没进行一步弹出栈顶,反向压入栈

九. 自下而上语法分析

在这里插入图片描述
在这里插入图片描述

短语 直接短语 句柄

在这里插入图片描述
注意: 构造语法分析树后再按特征寻找短语 直接短语和句柄

最左归约

在这里插入图片描述
规约前先画分析树找出短语和句柄后写出最左归约
最左归约逆过程实际上就是最右推导(规范推导)

剪句柄

即从分析树裁剪句柄
在这里插入图片描述
在这里插入图片描述

移进归约方法实例

在这里插入图片描述

LR分析

在这里插入图片描述

重点:移进归约分析表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

LR(0)和活前缀

在这里插入图片描述

定义:一个LR(0)项目(简称项目)是这样一个产生式,在它右部的某个位置有一个点“.”。对于A→ε,它仅有一个项目A→.。

在这里插入图片描述

拓广文法

在这里插入图片描述
简单的说就是添加一个S‘ 产生开始符S
LR(0)文法分析
在这里插入图片描述
分析过程:

首先要拓广文法,即如果文法开头不是一个非终结符到另一个非终结符的产生式则需要加入,如加入 S’->S .

在这里插入图片描述

然后需要构造 LR(0)自动机,就是加入了一个圆点,圆点后的符号是即将处理的符号,如果圆点后是非终结符时,则要写出该终结符为产生式左部的所有产生式。反复以上过程,直到不再扩大。给它们编号并写出读入下一个符号(即圆点后的符号)会跳转到哪。
然后构造 LR(0)分析表,左侧为项集族编号,上部为终结符和非终结符。中间内容表示该编号的项集族遇到非终结符应该移近还是归约,数字为跳转到的项集族编号,如果圆点到了产生式的最右边则应归约,反之移近。遇到终结符填入相应的项集编号即可。如 (0,a) 即第0行a列对应的是 S2,其意思为对于项集族 I0,如果下一个读入的符号为a,则移进到项集族 I2 ;又如第4行对应的都是 r1,其意思为对于项集族 I4,如果下一个读入的符号为一个终结符则需要按照编号为 (1) 的产生式进行归约;再如 (0,E) 对应的是 1,其意思为对于项集族 I0,如果下一个读入的符号为非终结符 E,则移进到项集族 I1.
r1表示归约式的序号为1

SLR(1)分析器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SLR分析表的构造

在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个里面的都是测试数据,总共得分5分。从控制台输入,不能从文件中读取。实现了基本功能,加分项目都没有去实现,没有函数数组这些的实现。这是用C++语言写的,新建parser类别要选C++,其他对于VS的配置和C语言一样。for语句用的是枚举所有情况,你可以自行修改。 对预备工作中自然语言描述的简化C编译器的语言特性的语法,设计上下文无关文法进行描述 借助Yacc工具实现语法分析器 考虑语法树的构造: 1.语法树数据结构的设计:节点类型的设定,不同类型节点应保存哪些信息,多叉树的实现方式 2.实现辅助函数,完成节点创建、树创建等功能 3.利用辅助函数,修改上下文无关文法,设计翻译模式 4.修改Yacc程序,实现能构造语法树的分析器 考虑符号表处理的扩充 1.完成语法分析后,符号表项应增加哪些标识符的属性,保存语法分析的结果 2.如何扩充符号表数据结构,Yacc程序如何与Lex程序交互,正确填写符号表项 以一个简单的C源程序验证你的语法分析器,可以文本方式输出语法树结构,以节点编号输出父子关系,来验证分析器的正确性,如下例: main() { int a, b; if (a == 0) a = b + 1; } 可能的输出为: 0 : Type Specifier, integer, Children: 1 : ID Declaration, symbol: a Children: 2 : ID Declaration, symbol: b Children: 3 : Var Declaration, Children: 0 1 2 4 : ID Declaration, symbol: a Children: 5 : Const Declaration, value:0, Children: 6 : Expr, op: ==, Children: 4 5 7 : ID Declaration, symbol: a Children: 8 : ID Declaration, symbol: b Children: 9 : Const Declaration, value:1, Children: 10: Expr, op: +, Children: 8 9 11: Expr, op: =, Children: 7 10 12: if statement, Children: 6 11 13: compound statement, Children: 3 12

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值