LR(0)项目集规范族和分析表的构造

1. LR分析

  • LR分析是干什么用的?简单来说就是你在编程时编译器用来判断你输入的符号串是否合法以及时哪一种类型。官方的说法时LR分析是一种能根据当前分析栈中的符号串和向右顺序查看输入串的k个符号就能唯一确定分析器的动作是移进还是归约和使用哪一个产生式规约。现在学习编译原理一个月了,到现在所学的内容只感到正则文法判别、自上向下分析、自下向上分析、有限自动机这几个主题有点用,但这些也是在设计编程语言的初始阶段,还有很多的内容需要学习。

2. LR组成部分

  • 总控程序:名字高达上,其实就是流程判别的实现代码
  • 分析表:这个最为重要,后面就是讲如何构建分析表。
  • 分析栈:分析栈包括符号栈和状态栈,很简单,属于数据结构的内容。

3:LR(0)项目集规范族的构建

  • 项目集规范族的构造方式有三种,这里采用第三种方式:把拓广文法的第一个项目{S’->*S}作为初态集的核,通过求核的闭包和转换函数,求出LR(0)项目集规范族,在由转换函数建立状态之间的连接关系。哇!好多陌生的词?什么叫拓广文法?什么叫核?…其实都很简单,看一个例子就能全部明白,不要被专业名词吓倒。
    LR(0)项目集规范族和分析表的构造_第1张图片
    利用上面的内容构建项目集规范族时,请记住下面的内容:若状态中包含如A->a*…B的项目,则型如B->*y的项目也在u此状态中。B为非终结符,y可为终结符或非终结符。
    LR(0)项目集规范族和分析表的构造_第2张图片

LR(0)分析表的构造

  • 分析表由两部分构成,一部分为动作表,表示当前状态下面临输入符号时应该做的动作为移进、归约、接受还是出错。动作表的列标只包含终结符和结束符#;另一部分为转换表,它表示在当前状态下面临文法符号时应该转向的下一个状态。
    若项目A->a*属于I(K),则对任何终结符a和#置ACTION[K,A]和ACTION[K,#]为r j _{j} j,j为在文法G‘中某产生式A->a的序号。r j _{j} j动作的含义为把当前文法符号栈顶的符号串a归约为A,并将栈指针从栈顶向下移动|a|个长度,符号栈中弹出|a|个符号,非终结符A编程当前面临的符号。
    LR(0)项目集规范族和分析表的构造_第3张图片
  • 有限状态自动机的实现请看我的另一篇博客。

你可能感兴趣的:(编译系统)