编译原理笔记10 自上而下分析-预…
2017-05-05 15:06
429 查看
预测分析程序与LL(1)文法
一、预测分析程序
1.带预测分析的PDA:
1)在PDA中加入预测分析之后,可以消除自上而下分析中出现回溯的现象,此时PDA可以改造为:
2)注:a、改造后,整个分析过程都在预测分析程序控制下工作。B、预测分析程序用了一个预测分析表,它是预测分析程序分析时的主要依据。
3)预测分析表:预测分析表是一矩阵M[A,a],其中行标A是非终结符,列标a是终结符或串结束符;矩阵元素M[A,a]是存放A的一个候选式,指出当前栈顶符号为A且面临读入符号为a时应选的候选式;或者存放“出错标志”,指出A不该面临读入符号a。
2.预测分析程序算法描述
设栈顶符号为X,读入符号为a,则
1)若X=a=‘#’,则表示识别成功,退出分析程序;
2)若X=a=‘#’,则表示匹配,弹出栈顶符号X,读头前进一格,让读头指向下一个符号,以读入下一个符号;若X是终结符,但X<>a,则调用error处理;
3)若X属于非终结符,则查预测分析表M。若M[X,a]中存放着关于X的产生式,则弹出X,且将相应产生式右部以自右向左的顺序压入栈,在输出带上记下产生式编号;若M[X,a]中存放着出错标记,则调用相应Error处理。
二、求串α的终结首符集和非终结符A的随符集
a) 求串α的终结首符集First(α)
i. 定义:假定α是文法G的一个符号串,α属于星闭包,则First(α)={a | α广义推导出a......a,a属于终结符}
注:1)若α推导出空串,那么空串就属于First(α)。
2)First(α)集合是α的所有可能推导出的开头终结符或空串所组成的集合。
ii. 算法
具体步骤:
b) 求非终结符A的随符集Follow(A)
i. 定义:假定S是文法G的开始符号,对于G的任何非终结符A,定义:
ii. 算法
1. 对文法开始符号S,将‘#’加入到Follow(S)中;
2. 若B->αAβ是文法G的一个产生式,则将First(β)-空串加入到Folow(A)中;
3. 若B->αA是文法G的一个产生式,或B->αAβ是文法G的一个产生式,且β推导出空串,则将Follow(B)加入到Follow(A)中;
注:这里的文法必须消除左递归且提取了左因子后的文法。
三、构造预测分析表
a) 基本思想
b) 构造算法
预测分析表的形式化:
四、LL(1)文法、
a) 定义:若文法G的预测分析表M中不含有多重定义项,则称G为LL(1)文法。
注:1)LL(1)文法是无二义的,二义文法一定不是LL(1)文法。
2)LL的含义是从左到右扫描输入串,采用最做推导分析句子。
3)数字1表示分析句子时需向前看一个输入符号。
4)有LL(1)就有LL(k),LL(k)向前看k个输入符号,选择候选式更加准确,但M的尺寸会以n的k次方增长,其中对程序设计语言去k=1就够了。
b) 证明定理
文法G是LL(1)文法当且仅当对于G的每个非终结符A的任何两个不同产生式A->α|β有:
五、状态表:
一、预测分析程序
1.带预测分析的PDA:
1)在PDA中加入预测分析之后,可以消除自上而下分析中出现回溯的现象,此时PDA可以改造为:
2)注:a、改造后,整个分析过程都在预测分析程序控制下工作。B、预测分析程序用了一个预测分析表,它是预测分析程序分析时的主要依据。
3)预测分析表:预测分析表是一矩阵M[A,a],其中行标A是非终结符,列标a是终结符或串结束符;矩阵元素M[A,a]是存放A的一个候选式,指出当前栈顶符号为A且面临读入符号为a时应选的候选式;或者存放“出错标志”,指出A不该面临读入符号a。
2.预测分析程序算法描述
设栈顶符号为X,读入符号为a,则
1)若X=a=‘#’,则表示识别成功,退出分析程序;
2)若X=a=‘#’,则表示匹配,弹出栈顶符号X,读头前进一格,让读头指向下一个符号,以读入下一个符号;若X是终结符,但X<>a,则调用error处理;
3)若X属于非终结符,则查预测分析表M。若M[X,a]中存放着关于X的产生式,则弹出X,且将相应产生式右部以自右向左的顺序压入栈,在输出带上记下产生式编号;若M[X,a]中存放着出错标记,则调用相应Error处理。
二、求串α的终结首符集和非终结符A的随符集
a) 求串α的终结首符集First(α)
i. 定义:假定α是文法G的一个符号串,α属于星闭包,则First(α)={a | α广义推导出a......a,a属于终结符}
注:1)若α推导出空串,那么空串就属于First(α)。
2)First(α)集合是α的所有可能推导出的开头终结符或空串所组成的集合。
ii. 算法
具体步骤:
b) 求非终结符A的随符集Follow(A)
i. 定义:假定S是文法G的开始符号,对于G的任何非终结符A,定义:
ii. 算法
1. 对文法开始符号S,将‘#’加入到Follow(S)中;
2. 若B->αAβ是文法G的一个产生式,则将First(β)-空串加入到Folow(A)中;
3. 若B->αA是文法G的一个产生式,或B->αAβ是文法G的一个产生式,且β推导出空串,则将Follow(B)加入到Follow(A)中;
注:这里的文法必须消除左递归且提取了左因子后的文法。
三、构造预测分析表
a) 基本思想
b) 构造算法
预测分析表的形式化:
四、LL(1)文法、
a) 定义:若文法G的预测分析表M中不含有多重定义项,则称G为LL(1)文法。
注:1)LL(1)文法是无二义的,二义文法一定不是LL(1)文法。
2)LL的含义是从左到右扫描输入串,采用最做推导分析句子。
3)数字1表示分析句子时需向前看一个输入符号。
4)有LL(1)就有LL(k),LL(k)向前看k个输入符号,选择候选式更加准确,但M的尺寸会以n的k次方增长,其中对程序设计语言去k=1就够了。
b) 证明定理
文法G是LL(1)文法当且仅当对于G的每个非终结符A的任何两个不同产生式A->α|β有:
五、状态表:
相关文章推荐
- 编译原理笔记7 自上而下语法分析-…
- 编译原理笔记9 自上而下语法分析-…
- 编译原理笔记11 自上而下分析-递…
- 编译原理笔记8 自上而下语法分析-…
- 编译原理笔记13 自底向上分析技术…
- 编译原理笔记5 词法分析
- 编译原理笔记12 自底向上分析技术…
- 编译原理笔记6 词法分析程序
- 编译原理笔记3 编译程序
- 编译原理笔记4 文法与语言
- 编译原理笔记2 引论续之编译程序的…
- 编译原理学习笔记---自上而下分析
- 10 个强大的开源 Web 流量分析工具
- HashMap实现原理分析(转自 Alpha's 学习笔记 )
- 编译原理学习笔记05——(识别孙悟空72变之魔鬼特训—递归下降分析程序构造)——2014_1_20
- 编译原理学习笔记——Lex&YACC(一)
- 编译链接原理&nbsp;&nbsp;&nbsp;C++
- 【编译原理】自上而下的语法分析之预测分析法
- 编译原理-&gt;词法分析器的分析
- [转]*PyQt4 精彩实例分析* 实例10 …