LR(0)分析算法

LL(1)分析算法

从左( L) 向右读入程序,最左(L) 推导,采用一个(1) 前看符号
++ 优点:
– 算法运行高效
– 有现成的工具可用
++缺点:
– 能分析的文法类型受限
– 往往需要文法的改写


自底向上分析算法

研究其中最重要也是最广泛应用的一类
++ LR分析算法(移进-归约算法)
– 算法运行高效
– 有现成的工具可用
++ 这也是目前应该广泛的一类语法分析器的自动生成器中采用的算法
– YACC, bison, CUP, C#yacc, 等


自底向上分析的基本思想

最右推导的逆过程!
LR(0)分析算法_第1张图片


点记号

为了方便标记语法分析器已经读入了多少输入,我们可以引入一个点记号 •
LR(0)分析算法_第2张图片


自底向上分析

LR(0)分析算法_第3张图片

另外的写法

LR(0)分析算法_第4张图片


生成一个逆序的最右推导

需要两个步骤:
– 移进 一个记号到栈顶上,或者
– 归约 栈顶上的n个符号(某产生式的右部)到左部的非终结符
这里写图片描述
核心的问题:如何确定移进和归约的时机?


算法思想

LR——利用了有记忆能力的自动机

LR(0)分析算法_第5张图片


LR(0)分析表

LR(0)分析算法_第6张图片


LR(0)分析算法

LR(0)分析算法_第7张图片

LR(0)分析算法_第8张图片


LR(0)分析表构造算法

LR(0)分析算法_第9张图片


Q=enQueue(C0)
//enQueue——入队
//Q就是作为一个工作表,看哪些状态没有计算过


D=goto(C,x)
//给一个项集(项目集合)C,在读入了一个文法符合(终结符T或非终结符N),它能够到达哪些状态。


goto和closure

LR(0)分析算法_第10张图片

你可能感兴趣的:(Compile)