语法分析笔记
语法分析笔记(四)——LR(0) SLR LR(1) LALR
目录
LR(0)
LR(0)项目
LR(0)的分析基础——增广文法
进行LR(0)分析的文法必须先转变成增广文法的形式
文法中的项目
构造LR(0)自动机
LR(0)分析表构造
这个形式化定义不常用(了解即可)
LR(0)分析过程中的冲突
移进——规约冲突:对于某一个状态,接受某个终极符后既可执行移进动作,也可执行规约动作
规约——规约冲突:对于某一个状态,接受某个终极符后既可执行规约动作1,也可执行规约动作2
I
2
\ _2
2中既存在移进——规约冲突(接收a),也存在规约——规约冲突
为了解决这种冲突,进一步优化LR(0)得到SLR分析
SLR
SLR相比LR(0)怎样避免冲突
SLR怎样构造分析表
SLR分析仍不能解决所有的冲突
为了继续解决冲突问题,提出了标题四种分析方法中分析能力最强的LR(1)分析法
LR(1)
为了继续进行优化,首先要找到SLR分析方法存在问题的原因
SLR分析存在问题的原因
也就是说,b属于follow集不一定就必须要进行规约,但是如果要进行规约,b必须属于follow集
LR(1)项目
LR(1)自动机
closure用来构造一个完整的状态
goto用来创建状态I在遇到X后应该转到的下一状态
LR(1)项集族就是所有状态的集合
形式化定义不常用,了解即可
LR(1)分析表构造算法
LALR
LALR为何被提出
因为LR(1)分析能力虽强,但它的状态太多了
LALR如何改进LR(1)
改进后的变化——合并同心项目集(合并同心状态)
合并同心项集
不会产生移进规约——冲突的原因:对于两个同心项目集中各自的移进项目来说,它们的展望符可能不同,但他们执行移进项目时所要接收的终极符a(假设为a)是确定且相同的,如果原本的LR(1)不存在移进——规约冲突,则说明两个同心项目集中所有规约项目的展望符集合不包含a,因此合并同心项集后不会造成移进——规约冲突。