java编写的LALR1文法分析器Word文档格式.docx
- 文档编号:13982974
- 上传时间:2022-10-16
- 格式:DOCX
- 页数:25
- 大小:23.95KB
java编写的LALR1文法分析器Word文档格式.docx
《java编写的LALR1文法分析器Word文档格式.docx》由会员分享,可在线阅读,更多相关《java编写的LALR1文法分析器Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
b.初始项目集扩大以及判断是否需要生成新项目集
c.同心集合并以及预测分析表的合并
Ⅱ.打印每个LALR
(1)的每个项目集
Ⅲ.打印该文法的预测分析表
Ⅳ.根据生成的预测分析表判断输入串是否合法,若不合法则给出相应的提示信息,若合法打印每个合法输入串的语法树
二、预期结果
1、能够打印出化简后的分析表【如下:
】。
状态
Action
Goto
+
(
)
#
S
S4
S5
1
2
3
acc
S6
r1
r3
4
7
5
r5
6
8
S9
r2
9
r4
2、打印出该文法的所有化简后的状态,并且给出给状态之间的转换过程。
手工推导出的化简的状态机图如下:
化简后的状态机图如下:
3、输入句子,判断该句子是否为该文法的句子,是则画出语法树。
例1:
如果输入ab。
结果:
因为b不为文法中的终结符,故显示输入错误。
例2:
如果输入a(a)。
虽然所有字符都是文法中的终结符,但因不符合文法,故显示错误提示信息。
例3:
如果输入a+a。
该句子符合该文法,所以显示正确的提示信息,并且画出语法树。
语法树样例如下:
a-T-E-\\
+-------E-S
a-T---//
三、分析过程
该文法分析器的构造思路为:
首先求出该文法的First集合和Follow集合;
据此导出文法的LR
(1)分析的状态机;
接下来化简LR
(1)得到LALR
(1)状态;
然后,画出LALR
(1)型的分析表;
最后根据生成的分析表判断输入的句子是否为该文法的句子。
构造过程如下:
由于本利程采用图形化界面,图像化界面设计原型如下:
输入框:
在这里输入需要判断的字符串:
显示分析结果的界面如下:
四、实际结果
实际输入界面:
输入例如“ab”错误时:
应该显示如下提示信息:
实际显示结果界面:
显示所有状态机:
以下给出完全LALR
(1)状态机:
LALR
(1)状态机如下:
I0:
Q->
.S#
S->
.E#
E->
.E+T#+
.T#+
T->
.(E)#+
.a#+
I1:
S.#
I2:
E.#
E.+T#+
I3:
T.#+)
I4:
(.E)#+)
.E+T)+
.T)+
.(E))+
.a)+
I5:
a.#+)
I6:
E+.T#+)
.(E)#+)
.a#+)
I7:
(E.)#+)
E.+T)+
I8:
E+T.#+)
I9:
(E).#+)
状态之间的转换如下:
I0S1
I0E2
I0T3
I0(4
I0a5
I2+6
I4E7
I4T3
I4(4
I4a5
I6T8
I6(4
I6a5
I7+6
I7)9
显示分析表:
显示输入字符串为“a+(a)”的语法树:
其分析过程如下:
步骤
状态栈
符号栈
输入串
动作
0
#
a+(a)#
移进
05
#a
+(a)#
规约:
用T->
03
#T
用E->
02
#E
026
#E+
(a)#
0264
#E+(
a)#
02645
#E+(a
)#
02643
#E+(T
)#
02647
#E+(E
10
026479
#E+(E)
11
0268
#E+T
用E->
12
用S->
13
01
#S
接受
当输入为a(a型错误时,应如下显示:
五、结果比对
通过比较发现所得结果与预期结果相符。
在分析过程中,会给出First集合和Follow集合。
预期结果如下:
First集合如下:
FIRST(Q)={(a}
FIRST(S)={(a}
FIRST(E)={(a}
FIRST(T)={(a}
Follow集合如下:
FOLLOW(Q)={#}
FOLLOW(S)={#}
FOLLOW(E)={#+)}
FOLLOW(T)={#+)}
通过打印输出的结果如下:
因为由LR
(1)简化得到LALR
(1)状态机:
如下给出LR状态及其转换:
LR
(1)状态机如下:
T.#+
(.E)#+
a.#+
E+.T#+
(E.)#+
T.)+
(.E))+
I10:
a.)+
I11:
E+T.#+
I12:
E+.T)+
I13:
(E).#+
I14:
(E.))+
I15:
I16:
(E).)+
I4T8
I4(9
I4a10
I6T11
I7+12
I7)13
I9E14
I9T8
I9(9
I9a10
I12T15
I12(9
I12a10
I14+12
I14)16
六、个人感想
在本次试验中,主要碰到的问题是First集、Follow集的求解,递归求集合的函数中有的并不是用递归得到,而是直接返回,造成一些元素漏了,通过仔细对照书本的求法,最终理解了递归求集合的方法。
通过本次试验,了解最为简单的编译器的编写。
附录:
部分源码
1、申明的变量及其注释;
privateMap<
Character,String>
mapt=newHashMap<
();
//终结符
Character,Integer>
mapn=newHashMap<
//非终结符
privatecharmap[]=newchar[5];
privateStringpro[]=newString[10];
privateintlen=0;
//产生式的个数
privateintcntn=0;
//非终结符个数
privateintcntt=0;
//终结符个数
privatecharfirst[][]=newchar[5][8];
privatecharfollow[][]=newchar[5][8];
privateintfirstlen[]=newint[5];
privateintfollowlen[]=newint[5];
privateStringI[][]=newString[200][8];
//LALR项目集
privateStringIt[][]=newString[200][8];
//LR后跟的集合
privateStringIori[]=newString[25];
privateStringItori[]=newString[8];
privateintIcnt[]=newint[200];
//每个项目集中产生式的个数
privateintIoricnt[]=newint[200];
//每个项目集的原始产生式个数
privateintInum=0;
//项目集的个数
privateintTaction[][]=newint[200][10];
privateintTgoto[][]=newint[200][5];
privateStringmstr=null;
//要分析的句子
privateintescape1[]=newint[8];
//终结符要跟着输出的空格数
privateintescape2[]=newint[5];
//非终结符
2、First集合处理函数;
publicbooleanFindFirst(intu,charv){//查看第u个非终结符的first集是否包含终结符v
inti;
for(i=0;
i<
firstlen[u];
i++){
if(first[u][i]==v)returntrue;
//包含则返回true
}
returnfalse;
}
publicbooleanAddFirst(intu,intv){//查看第v个非终结符的first集是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 编写 LALR1 文法 分析器
![提示](https://static.bdocx.com/images/bang_tan.gif)