LL1文法判定.docx
- 文档编号:2819506
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:33
- 大小:70.83KB
LL1文法判定.docx
《LL1文法判定.docx》由会员分享,可在线阅读,更多相关《LL1文法判定.docx(33页珍藏版)》请在冰豆网上搜索。
LL1文法判定
编译原理课程设计
LL
(1)文法判定
专业班号________
学生姓名_________
指导教师________
联系电话:
邮箱地址:
2005年12月29日
目录
目录2
第一章前言3
1.1原理简单概述3
1.2文档概述3
第二章语言文法规则3
2.1语言的词法规则3
2.2语言的语法规则3
2.3代码生成规则3
第三章程序设计4
3.1词法分析程序的实现4
3.2语法分析程序的实现4
3.2.1能推出$的非终结符4
3.2.2FIRST集的确定4
3.2.3FOLLOW集的确定6
3.2.4SELLECT集的确定6
3.2.5LL
(1)文法的判定7
3.3句子的判定7
3.4其它说明7
第四章系统运行及测试8
4.1运行和安装环境8
4.2系统运行8
4.2系统测试10
4.2.1测试一10
4.2.2测试二11
第五章结论12
5.1系统结论12
5.2存在的不足12
参考文献12
附录112
测试1完整结果截图12
测试2完整结果截图:
14
附录215
源程序15
第一章前言
1.1原理简单概述
LL
(1)文法使用的是确定的自顶向下的分析技术。
LL
(1)的含义是:
第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式(规则)进行推导。
LL
(1)文法的判别需要依次计算FIRST集、FOLLOW集和SELLECT集,然后判断是否为LL
(1)文法,最后再进行句子分析。
1.2文档概述
此文档主要介绍FIRST集、FOLLOW集和SELLECT集的计算以及句子分析的算法。
第二章语言文法规则
2.1语言的词法规则
在本示例程序中,单个字符(字母、数字、符号甚至是汉字)可以规定为终结符或非终结符,但是"$"和"#"符号作为空串处理不可以作为终结符或非终结符去处理。
2.2语言的语法规则
(1)产生式的右部不全是有终结符组成
(2)如果两个产生式有相同的左部,他们的右部是由不同的终结符或非终结符开始
2.3代码生成规则
略
第三章程序设计
3.1词法分析程序的实现
由于本程序简单,所以依次扫描遇到的每一个字符即可确定哪些是终结符哪些是非终结符。
3.2语法分析程序的实现
3.2.1能推出$的非终结符
首先进行第一次扫描,把能够直接推出$的非终结符号记录到空串表,把不能直接推出$的符号依次记录下来,然后单个扫描每一个不能直接推出$的符号。
扫描这个符号能够直接推出的第一个非终结符记录到一个队列,接下来依次检查队列中每一个元素,把二次能够推出$的符号记录到空串表,把二次也推不出空串的继续送入到队列,然后再从队列取元素扫描,直到队列为空没能找到能够星推导出$的终结符,那么可以确定这个非终结符推导不出$。
接下去扫描下一个非终结符。
3.2.2FIRST集的确定
FIRST集使用以下四个步骤判定:
(1)若X∈VT,则FIRST(X)={X}
(2)若X∈VN,且有产生式X→a…,a∈VT
则把a加入到FIRST(X)中,即a∈FIRST(X)
(3)若X∈VN,且有产生式X→$,
则把$也加到FIRST(X)中,即$∈FIRST(X)
(4)若X∈VN,Y1,Y2,…,Yi都∈VN,且有产生式X→Y1Y2…Yn。
当Y1,..Yi-1=>$(1≤i≤n),则FIRST(Y1)-{$},…,FIRST(Yi-1)-{$},FIRST(Yi)都包含在FIRST(X)中,即:
FIRST(Yi-1)-{$}∈FIRST(X)
所有Y1,…Yn*=>$,则把$加到FIRST(X)中,即:
FIRST(Yi)∈FIRST(X)
其中第1~3个方法都很好处理,关键是第四个方法判断时首先判断第一个字符为非终结符,设定一个布尔型扫描标志FLAG,赋初值TRUE,接下去依次扫描产生式右部每一个字符Yi,假如第i个字符可以推出空,那么就把这个字符的FIRST集去除$加入到产生式左部字符的FIRST集中,即FIRST(Yi)-{$}
FIRST(X),假如Yi是终结符或者不可以推出$,那么就把这个字符的FIRST集直接加入到FIRST(X)中,即FIRST(Yi)
FIRST(X)同时置FLAG为FALSE不再向下扫描,假如Yi恰好是最后一个字符,那么不管它能不能星推导出空都直接把它的FIRST集加入到FIRST(X)中。
同时要设置一个队列和一组布尔型变量记录FIRST集是否完成,队列用来记录FIRST(X)用到了哪些其它非终结符的FIRST集。
第一遍扫描完成后就扫描队列,把FIRST集完成的非终结符的FIRST集加入到那些没有完成的非终结符的FIRST集中去,没有完成的非终结符再送回到队列,这时候可能出现死循环,比如FIRST(S)用到了FIRST(A),而FIRST(A)用到了FIRST(B),FIRST(B)又用到了FIRST(S),这时候S,A,B的FIRST标志均为FALSE,无限循环下去。
这时候可以记录一下,比如循环了100次,强行设置FIRST(S)的标志为TRUE,那么FIRST(A),FIRST(B)也就依次可以求出了。
我们在实际计算时也是这样处理的。
只是没有把标志写出来而是记录在心里的。
对于100次循环或许有些多了,那么到极限情况,可能就是循环总共产生式的个数次数时如果再循环就可以确定是进入死循环了。
3.2.3FOLLOW集的确定
FOLLOW集使用以下三个步骤判定:
(1)如果X是开始符那么把#加入到FOLLOW(X)
(2)若A=>αBβ是一个产生式,则把FIRST(β)-{$}加至FOLLOW(B)中
(3)若A=>αB是一个产生式,或A=>αBβ是一个产生式而β*=>$(即$∈FIRST(β)),则把FOLLOW(A)加至FOLLOW(B)中
FOLLOW集的求法与FIRST集类似,但有不同的地方。
FOLLOW集需要扫描每一个产生式。
而FIRST集扫描的是产生式左部不同的产生式,然后扫描左部相同的产生式的每一个右部。
FOLLOW集第一次扫描可以确定哪些FIRST集或FOLLOW集属于所求的FOLLOW集,由于FIRST集已经求出,所以第一次扫描就可以把相应的FIRST集加入到FOLLOW集中,设置FOLLOW集完成标记位,设置队列,把未完成的非终结符送入队列,依次取出队列元素,把求出FOLLOW集的非终结符的FOLLOW集加入到相应的FOLLOW集中,把未求出的送回队列。
碰到死循环使用FIRST集一样的方法处理就可以。
3.2.4SELLECT集的确定
FIRST集&FOLLOW集都已经求出来后SELLECT集就很好求了,扫描每一个产生式,使用以下三个步骤确定:
A→αA∈VN,α∈V*,
(1)若α是终结符,那么SELLECT(A→α)={α}
(2)若α是$,则SELECT(A→α)=FOLLOW(A)
(3)若α是非终结符那么
若α*=>$,则SELECT(A→α)=(FIRST(α)-$)∪FOLLOW(A)
若α┐*=>$则SELECT(A→α)=FIRST(α)
3.2.5LL
(1)文法的判定
当SELLECT集求出来后就可以判断是不是一个文法是不是LL
(1)文法了,扫描产生式左部相同的SELLCET集是否含有相同元素,一旦发现相同元素立刻返回FALSE,扫描结束没有发现相同元素则返回TRUE。
3.3句子的判定
当一个文法确定是LL
(1)文法时就可以对输入的语句进行判定了。
首先要安装SELLECT集生成LL
(1)预测分析表,最简单的方法是使用哈希表来表示,把每一个产生式左部依次和这个产生式SELLECT集中的每一个终结符组成关键字,其值即为这个产生式,送入哈希表。
这样在进行句子的分析时就可以很容易判断是否使用某一个产生式来进行规约。
在实际分析时设置两个栈,把"#"压入分析栈和剩余栈,把开始符压入分析栈,把输入串从右向左送入剩余栈,然后只要两个栈元素个数同时大于1,那么依次从两个栈中取出两个元素进行比较,假如一样就匹配,假如可以规约就规约,否则就不是该文法的句子。
3.4其它说明
本程序使用C#编写,有良好的用户界面,在程序当中,SymboleSet类表示终结符和非终结符集合,使用单例模式在整个运行当中只有一个实例,Product类是产生式类,一个对象记录一个左部,和多个右部产生式。
因为程序中用到了栈,队列和ArrayList类(对象数组类,数组中每个元素都可以是一个object对象),因此还编写了Tools类,来处理一些栈的顺序输出,栈的逆序输出,ArrayList的连接,输出等操作,其中的方法全部均为静态,Tools类的UML图如下
其它主要算法均包含在frmMain.cs当中。
第四章系统运行及测试
4.1运行和安装环境
2000或XP系统,安装.NetFrameWork1.1以上版本即可运行。
需要调试程序请安装.NetFrameWorkSDK1.1以上版本或直接安装VisualStudio.Net2003以上版本。
4.2系统运行
运行界面如下:
4.2系统测试
4.2.1测试一
产生式集:
S→AB
S→bC
A→$
A→b
B→$
B→aD
C→AD
C→b
D→aS
D→c
非终结符
推出空$
FIRST集
FOLLOW集
S
TRUE
$ba
#
A
TRUE
b
ac#
B
TRUE
a
#
C
TRUE
$bac
#
D
FALSE
ac
#
产生式
SELECT集
S→AB
ba#
S→bC
b
A→$
ac#
A→b
b
B→$
#
B→aD
a
C→AD
bac
C→b
b
D→aS
a
D→c
c
该文法不是LL
(1)文法
测试字符串:
abcdeda
预测分析表:
无
步骤分析栈剩余输入字符
使用产生式或匹配
无
结论:
字符串abcdeda无法检测是不是该文法的句子
4.2.2测试二
产生式集:
S→aH
H→aMd
H→d
M→Ab
M→$
A→aM
A→e
非终结符
推出空$
FIRST集
FOLLOW集
S
FALSE
a
#
H
FALSE
ad
#
M
TRUE
$ae
db
A
FALSE
ae
b
产生式
SELECT集
S→aH
a
H→aMd
a
H→d
d
M→Ab
ae
M→$
db
A→aM
a
A→e
e
该文法是LL
(1)文法
测试字符串:
aaabd
预测分析表:
a
d
b
e
#
S
S→aH
H
H→aMd
H→d
M
M→Ab
M→$
M→$
M→Ab
A
A→aM
A→e
步骤
分析栈
剩余输入字符
使用产生式或匹配
1
#S
aaabd#
S→aH
2
#Ha
aaabd#
'a'匹配
3
#H
aabd#
H→aMd
4
#dMa
aabd#
'a'匹配
5
#dM
abd#
M→Ab
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LL1 文法 判定