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.求值