归约

可将自底向上语法分析过程看成将一个串ω"归约"为文法开始符号的过程.
在每个归约步骤中,
一个与某产生式体相匹配的特定子串被替换为该产生式头部的非终结符号.

句柄剪枝

如有S=>^{*}_{rm} αAω =>_{rm} αβω,
则A->β是αβω的一个句柄.
最右句型γ的一个句柄是满足下叙条件的产生式A->β及β在γ出现的位置:
将此位置的β替换为A后得到的串是γ的某个最右推导序列位于γ之前的最右句型.
ω只含终结符号.从被分析的终结符号串ω开始,
如ω是当前文法的句子,令ω=γ_{n},是某个最右推导的第n个最右句型.
在γ_{n}寻找β_{n},将其替换为对应产生式头部.
得到前一最右句型.直到得到S.

移入-归约语法分析

句柄总是在栈的顶端.
考虑任意最右推导两个连续步骤所有可能

反向考虑1,
一个移入-归约语法分析器刚刚到达
栈               输入
$αβγ            yz$
将γ归约为B
$αβB            yz$
多次移入
$αβBy           z$
βBy归约为A
$αA             z$
反向考虑2,类似.两种情况下句柄都在栈顶.[k之前按假设句柄都在栈顶.考察k步,[移入/归约]证明k步处理后,句柄仍在栈顶.]

项和LR(0)自动机

一个LR语法分析器通过维护一些状态,
用这些状态表明我们在语法分析过程中所处的位置,
进而做出移入-归约决定.
这些状态代表了"项"集合.
一个文法G的一个LR(0)项是G的一个产生式再加上一个位于它的体中某处的点.
故,产生式A->XYZ产生了四个项.
A->.XYZ
A->X.YZ
A->XY.Z
A->XYZ.
产生式A->ε只有一个A->.一个称为规范LR(0)项集族的一组项集提供了构建一个确定有穷自动机的基础.
这个LR(0)自动机的每个状态代表了规范LR(0)项集族中的一个项集.
表达式文法4-1对应的自动机显示在图4-31.为构造一个文法的规范LR(0)项集族,
定义一个增广文法,两个函数CLOSURE和GOTO.
如G是一个以S为开始符号的文法,
则G的增广文法G'是在G中加上新开始符号S'和产生式S'->S得到的.项集的闭包
如I是文法G的一个项集,
则CLOSURE(I)是根据下面两个规则从I构造得到的项集
1.一开始,将I中的各个项加入到CLOSURE(I)中.
2.对CLOSURE(I)中的A->α.Bβ.
B->γ是B的一个产生式,
项B->.γ加入CLOSURE(I).
SetOfItems CLOSURE(I)
{J = Irepeatfor(J中的每个项A->α.Bβ)for(G的每个产生式B->γ)将B->.γ加入J中[自动过滤重复]until 在某轮没新的项被加入J中return J
}
项的分类:
1.S'->.S及点不在最左端的所有项
2.除S'->.S外,点在最左端的所有项GOTO函数
GOTO(I, X)被定义为I中所有形如[A->α.Xβ]的项所对应的项[A->αX.β]的集合的闭包.
GOTO(I,X)存在下,表示I下遇到X执行移入.
GOTO(I,X)存在情况下,
I中不能同时存在可对X进行归约的产生式,因为这样会产生冲突
// 规范LR(0)项集族计算
void items(G')
{C = {CLOSURE({[S'->.S]})}repeatfor(C中的每个项集I)for(每个文法符号X)如果GOTO(I,X)存在,加入C[防止项集重复]
}

LR语法分析表的结构

语法分析表由两个部分组成:ACTION和GOTO
1.ACTION函数有两个参数,一个是状态i,另一个是终结符号a[或输入结束标记$]
ACTION[i, a]的取值可有下列四种形式:
a. 移入j,把输入符号a移入栈,用状态j代表a
b.归约A->β,把栈顶的β归约为产生式头,状态对应调整
c.接受
d.报错

LR语法分析器的格局

语法分析器的完整状态包括:它的栈和余下的输入
LR语法分析器的格局是一个形如(s_{0}...s_{m},a_{i}...a_{n}$)的对.
第一个分量是栈中内容,第二个分量是余下输入.
上述格局表示了如下的最右句型:
X_{1}...X_{m}a_{i}...a_{n}
每个X_{i}和s_{i}存在一一对应关系.
s_{i-1}通过X_{i}到达s_{i}.

LR语法分析器的行为

 语法分析器根据上面的格局决定下一个动作时,先读入当前输入符号a_{i}和栈顶状态s_{m}.再在分析动作表中查询ACTION[s_{m}, a_{i}].1.如ACTION[s_{m}, a_{i}] = 移入s,则语法分析器执行一次移入动作;将下一状态s移入栈中,进入(s_{0}...s_{m}s, a_{i+1}...a_{n}$)2.如ACTION[s_{m}, a_{i}] = 规约A->β,则语法分析器执行一次归约动作,进入(s_{0}...s_{m-r}s, a_{i}...a_{n}$)其中,r是β的长度,且s=GOTO[s_{m-r}, A]3.如ACTION[s_{m}, a_{i}] = 接受,完成语法分析4.如ACTION[s_{m}, a_{i}] = 报错.

LR语法分析算法

输入:一个输入串ω和一个LR语法分析表
这个表描述了文法G的ACTION和GOTO
输出:
如ω在L(G)中,输出ω的自底向上语法分析过程中的归约步骤;
否则,给出错误指示.
方法:
最初,语法分析器栈中内容为初始状态s_{0},
输入缓冲区中内容为ω$.
语法分析器执行下述程序
令a为ω$的第一个符号;
while(1)
{令s是栈顶的状态;if(ACTION[s, a] = 移入t){将t压入栈中;令a为下一个输入符号;}else if(ACTION[s, a] = 归约A->β){从栈中弹出|β|个符号;令t为当前的栈顶状态;将GOTO[t, A]压入栈中;输出产生式A->β;}else if(ACTIOIN[s, a] = 接受){break;}else{调错误恢复例程;}
}

构造SLR语法分析表

构造一个SLR语法分析表
输入:一个增广文法G'
输出:G'的SLR语法分析表函数ACTION和GOTO
方法:
1.方法决定
a.如 [A->α.aβ] 在I_{i}中
且GOTO(I_{i}, a) = I_{j},
则将ACTION[i, a]设置为"移入j".
b.如 [A->α.] 在I_{i}中,
则对FOLLOW(A)中所有a,
将ACTION[i, a]设置为"归约A->α"
这里A != S'
c.如 [S'->S.] 在I_{i}中,
则将ACTION[i, $]设置为"接受"
3.状态i对于各个非终结符号A的GOTO转换使用下面的规则构造得到:
如GOTO(I_{i}, A) = I_{j},
则GOTO[i, A] = j.
4.对2,3,没定义的条目,设为报错.
5.语法分析器的初始状态就是根据[S' -> .S]所在项集得到的.

如果文法,按上述处理,在某步产生归约/移入冲突,
则该文法的语法分析无法按上述方式处理.

可行前缀

E =>^{*}_{rm} F * id =>_{rm} (E) * id
在语法分析的不同时刻,
栈中存放的内容可以是( (E (E),但不会是(E) *
因为*移入前,(E)会被归约为F.
可以出现在一个移入-归约语法分析器栈中的最右句型前缀称为可行前缀一个可行前缀是一个最右句型的前缀,
且它没越过该最右句型的最右句柄的右端.
据此定义,
总是可在一个可行前缀后增加一些终结符号来得到一个最右句型.如存在一个推导过程
S=>^{*}_{rm} αAω =>_{rm} αβ_{1}β_{2}ω
就说项A ->  β_{1}.β_{2} 对可行前缀αβ_{1}有效可行前缀是可以出现在语法分析栈中的一个句型.
对可行前缀有效的项,意味着可行前缀后再添加0个或多个文法符号后,将按此项进行归约.对文法计算出所有可行前缀,
对每个可行前缀计算出所有对其有效的项.实际上,
LR语法分析理论的核心定理是:
如我们在某个文法的LR(0)自动机中从初始状态开始
沿着标号为某个 可行前缀γ 的路径到达一个状态,
则该状态对应的项集就是 γ 的 有效项的集合.

编译原理--语法分析:LR相关推荐

  1. 编译原理语法分析之LR分析

    要求: (1)根据给定文法,先对文法进行解析,构造识别活前缀的DFA并输出: (2)根据DFA构造LR分析表并输出: (3)分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程) (4) ...

  2. 【编译原理】LR语法分析器的设计与实现

    LR语法分析器的设计与实现 本文为当时编译原理实验作业,要求用设计的思想完成,小题大做,仅供参考 文章目录 LR语法分析器的设计与实现 实验要求 实现功能 输入输出 样例 一.LR语法分析器问题定义 ...

  3. 编译原理lr(0)c语言,关于编译原理:LR(1)LR(0)文法判断?

    "编译原理"是大学计算机类专业的一门主干课程.设置本课程的目的,在于系统的向学生讲述编译系统的结构.工程流程以及编译程序各组成部分的设计原理和实现技术,使学生通过本课程的学习,既掌 ...

  4. [编译原理]构造LR分析器和SLR移进归约分析表

    目录 目标 1.基础知识引入 1.1 文法 1.2 拓广文法 1.3 全部的项目集 2. 计算文法的LR(0)项目集的.识别活前缀的DFA 2.1 分析得到各个项目集 2.2 构建SLR分析表中的移进 ...

  5. 编译原理:语法分析实验(LR分析法)

    语法分析实验 一.实验目的 根据LR分析法的原理,对指定文法构造识别活前缀的DFA,做出相应的LR分析表,并编程实现相应的语法分析程序.或根据预测分析法的原理,对指定文法构造预测分析表,并编程实现相应 ...

  6. 编译原理 --- 语法分析概念,自上而下分析面临的问题以及如何消除左递归问题

    第一部分 --- 语法分析基本概念 1.上面这个箭头 --> 符号表示的意思是P被 α 定义 A是一个非终止符,γ是一个和α,β属于同一个集合的元素 1.一个双箭头符号表示的是直接推出,而一个双 ...

  7. 编译原理 - 语法分析(自下而上分析)

    自下而上语法分析 两种语法分析对比 自下而上语法分析(Bottom-up) 核心思想 - (移进-规约) 移进 : 移进到栈里,当形成产生式时就弹出(规约) 规约 : 右部符号替换为左部符 移进-规约 ...

  8. 【编译原理】LR(0)分析方法(c++实现)

    基本流程 Created with Raphaël 2.2.0 输入文法 拓广文法 求项目集规范族 GO[I,a]转移函数 构造DFA (识别活前缀的自动机) LR(0)分析表 LR(0)分析输入串 ...

  9. 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器

    05-01: Introduction to Parsing 语法分析 parser的作用: 05-02: Context Free Grammars 上下文无关文法 CFG(上下文无关文法)回答了一 ...

  10. 编译原理 语法分析树和二义性文法

    语法分析树是用来描述语法中句子结构的一种树,它能够动态表示一个句子推导的过程. 我们来看一个例子:由左边的文法规则可知,这是一个实现加法减法和乘法的算术表达式.从开始符号E开始,逐步推导,E => ...

最新文章

  1. 中国首个虚拟学生入学清华大学!双商在线、颜值出众,你想跟她做同学吗?
  2. 在 StringGrid 上画线时, 使用 GDI+ 以消除锯齿 - 回复 gsjn_8888_6666 的问题
  3. # 睡眠3秒_小儿睡眠呼吸暂停综合征
  4. 介绍一个办法查TREX search的log
  5. SELECT执行过程,MySQL聚合函数,多行分组函数,GROUP BY HAVING,详细完整可收藏
  6. php 载入css就可以显示,如何在进度条加载后显示页面
  7. 整理一篇Linux drm显示系统的文章
  8. 五个实用又有趣的网站
  9. 将一个十六进制数的字符串参数转换成整数返回
  10. osea/ 5.0-6.0
  11. 微信小程序之点餐系统附源码
  12. 使用Selenium获取当当网异步加载的部分分类数据
  13. html div设置有空隙,如何解决img标签下面的小空隙
  14. 终止上市后,依图瞄准自动驾驶赛道|钛媒体独家
  15. 移动应用安全开发要求(1,源码安全)
  16. 【已解决】win10修改用户名,禁用Administrator后,若要继续,请输入管理员用户和密码,只有否
  17. js时间格式转换收录
  18. 数学符号对应的英文读音
  19. cpu选择K还是f?哪个更靠谱?
  20. 全屏在线秒表_在线秒表

热门文章

  1. Android美图手机太低,十个你不知道的美图秀秀Android版小秘密
  2. 《小投入快收入》—— 创业经
  3. Flutter和原生iOS调用相册
  4. 游戏引擎Flax Engine源码分析(十)渲染
  5. 常见电容器图片_中频炉常见故障及成因大集结!收好,免得临时抱佛脚!
  6. AQTime新手入门
  7. 机器人视觉系统组成及定位算法
  8. Huffman编码的C语言实现
  9. 全民k歌视频在线解析下载,手把手教你如何批量下载
  10. deeplab v3+ 源码详解