编译原理之SLR(1)和语法制导的翻译

1.SLR(1)思想:

基于容许LR(0)规范集中有冲突的项目集,用向前查看一个符号的办法进行处理,解决冲突,因为只对有冲突的状态才查看一个符号,是一种简单的LR(1)分析法,用SLR(1)表示

2.SLR(1)分析的简单方法:

简单向前看1集合:一类是文法符号X下的转换,集合是{X}(移进项)

                                另一类是U ::= u的转换,集合是follow(U)(归约项)

3.SLR(1)的判断:

(1)如果对于一个文法LR(0)项目及规范族的某些项目集或LR(0)分析表中含有的冲突能用上述方法解决,则称这个文法是SLR(1)文法

(2)SLR(1)分析表中无重复定义

4.在上下文无关文法G[S]的基础上,为文法符号关联有特定意义的属性(大多数是非终结符),并为产生式关联相应的语义动作或条件谓词(语义规则),称之为属性文法,并称文法G[S]是这一属性文法的基础文法。

5.属性的分类

综合属性:重写规则(产生式)左部的属性是综合属性(自底向上)

继承属性:产生式右边的符号(非终结符)的属性是继承属性(自顶向下)

内在属性:不会再属性定义中出现集合中的属性,通常是终结符的属性,如digit.val,由词法分析程序提供的属性值

例一:

判断属性只看赋值符号(:=)的左边,看左边的式子在产生式中的位置即可,在本例子中,全是综合属性

例二:

在本例子中,第一条语义规则中赋值符号的左侧是L的式子,在产生式中,L位于右侧,因此是继承属性

补充:有时语义规则的目的是为了产生一个副作用,比如打印一个计算结果(print)或者是添插符号表(addtype),此时,语义规则通常写成函数调用的形式function(c1,c2...),可看作是产生式做不文法符号的虚综合属性

6.遍历语法树进行语义计算

无圈依赖图(没有于一动作也就是虚节点构建的依赖图)以及语义计算

1.建立语法树,一般会给我们一个文法G[S]附带语义规则和一串要推导的式子,我们先建立一个语法树

2.直接看语义规则,如果非终结符含有某个属性,就将这个属性写在这个非终结符的附近,并且进行连接

3.在语法树中,将赋值语句中的式子指向被赋值的值,建立有向线段

4.如果依赖图是无圈的,从未被指向的点出发,进行式子的值的判断

这是课本中描写的步骤:

这是我们写出来的节点后的大概图像:

根据这个我们就知道,语义规则中与N有关的式子只有N.v,与S有关的式子有S.f,S.l,S.v三个式子

连接后的有向边如图:

如果我们知道有向边的起点,我们就可以求出有向边的终点,求的方法就运用的是语义规则中给我们提供的方法。

最后经过计算,我们写出了这样的带标注的语法分析树,这也是我们的最终结果

了解了这些,让我们一起来看一道例题吧

1.先建立语法分析树

2.标注语义规则中含有的值

3.建立有向边

4.求值

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SLR(1)是一种语法分析器,用于解析上下文无关文法。下面是一个简单的SLR(1)实验: 1. 首先,需要定义上下文无关文法。例如,考虑以下文法: ``` S -> E E -> E + T | T T -> T * F | F F -> ( E ) | id ``` 2. 接下来,需要构造文法的SLR(1)分析表。这个表将会告诉分析器在哪里进行移进(shift)和规约(reduce)操作。可以通过以下步骤构造分析表: a. 计算每个非终结符的FIRST集和FOLLOW集。 b. 对于每个产生式,找出它的FOLLOW集,并将它添加到该产生式的FOLLOW集中。 c. 对于每个非终结符A和每个终结符a,找出A可以推导出的所有产生式,并将它们添加到分析表中的[A, a]项中。如果这些产生式是形如A -> α的,那么将移进项Sj添加到[A, a]项中,其中j是在项Sj中第一个符号是a的那个状态。 d. 对于每个非终结符A和每个终结符a,找出A的FOLLOW集中的所有符号,并将它们添加到分析表中的[A, a]项中。如果A是文法的开始符号,那么将接受项acc添加到[A, $]项中。 3. 最后,使用分析表进行语法分析。首先,将输入符号串转换为一个词法单元序列。接下来,使用一个栈来跟踪分析过程。将栈初始化为只包含状态0。然后,重复以下步骤: a. 从输入中读取下一个符号。 b. 在分析表中查找当前状态和下一个符号的项。 c. 如果该项是移进项,将下一个符号压入栈中,并转移到新状态。如果该项是规约项,将产生式右侧的符号弹出栈,并使用产生式左侧的符号替换它们。然后,再次在分析表中查找当前状态和新符号的项,并将新项推入栈中。 d. 如果分析表中没有与当前状态和下一个符号匹配的项,则报告语法错误。 e. 如果下一个符号是结束符号$,并且栈中只剩下一个状态,那么分析成功。 以上是一个简单的SLR(1)实验的步骤。在实际应用中,可能需要更复杂的文法和更复杂的分析表构造算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值