语法分析器实验报告Word格式.docx
《语法分析器实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《语法分析器实验报告Word格式.docx(49页珍藏版)》请在冰豆网上搜索。
1.3.2鼠标输入
可在“文法管理系统”界面通过鼠标点击任意菜单选项,实现对应功能。
当文法或推导过长时,点击对应文本域滚动滚轮可查看余下全文。
1.3.3文件输入
可输入任意存储了正确文法的txt文件,默认有Pascal风格的文法和C语言风格的文法,格式如下:
Pascal风格:
St:
:
=Assign|IfS|WhS
Assign:
=id:
=E
E:
=E+E|E-E|E*E|E/E|(E)|id
IfS:
=ifBEthenSt|ifBEthenStelseSt
BE:
=id>
id|id==id|id<
id
WhS:
=whileBEdoSt
C语言风格:
S:
=assignS|ifS|whileS
assignS:
=id=E|id+=E|id-=E
=E+T|E-T|T
T:
=T*F|T/F|F
F:
=id|(E)
ifS:
=ifBES|ifBESelseS
=E>
E|E==E|E<
E|E>
=E|E!
=E|E<
whileS:
=whileBES
1.4输出形式
输出到显示器。
“文法管理系统”界面左侧文本域输出文件中存储的文法。
右侧文本域输出文法的终结符集、非终结符集,产生式集合或输出句子的推导过程。
点击“显示语法分析树”菜单选项在新窗口输出语法分析树。
1.5课设的功能
“文法管理系统”可输入任意存储了正确文法的txt文件。
文法G应为一个四元组:
G=(VT,VN,P,S),其中VT表示终结符集。
VN表示非终结符集,VT∩VN=Φ。
S表示开始符号,S∈VN。
P表示产生式集合,α→β,被称为产生式。
其中α∈(VT∪VN)+,且α中至少有VN中元素的一个出现。
β∈(VT∪VN)*。
α称为产生式α→β的左部,β称为产生式α→β的右部。
在此以题目要求中给出的算术表达式文法G[E]为例说明其主要功能。
1.5.1存储文法并显示
新建一个文本文档,在文档中输入文法G[E](两语句间需要换行,两符号间需要空格):
点击“输入文法”菜单中的“打开文法”,弹出文件选择器,找到文件所在位置并打开。
左侧文本域直接输出文件内容:
系统自动存储其终结符(7个)、非终结符(3个),产生式规则(8个),并以在右侧文本域输出:
1.5.2建立推导并显示句子的生成
点击“建立推导”菜单中的“建立推导”,弹出对话框,用户在“请输入”下的文本框输入句子如“a*b/c”(两符号间需要空格)。
点击确定或按下回车后,系统自动按照G[E]的产生式规则推导出句子、计算出推导用时并在右侧文本域动态显示“句子的生成”:
之后系统自动构造并存储该推导对应的语法分析树。
若用户没有打开文法,右侧文本域不会有任何显示。
若句子无法被推导出来,右侧文本域显示没有(正确的)推导过程:
用户可以点击“输入文法”菜单中的“显示文法”或“建立推导”菜单中的“显示推导”切换右侧文本域输出的内容。
1.5.3构造语法分析树并用图形界面显示
点击“构造语法分析树”菜单中的“显示语法分析树”。
弹出新窗口显示推导对应的语法分析树:
1.5.4判断二义性
点击“建立推导”菜单中的“判断二义性”,对于有二义性的句子,系统弹出消息框:
之后右侧文本域输出新的推导过程。
会弹出新窗口显示新的的语法分析树。
若句子没有二义性,则弹出消息框:
二.概要设计
本次课设使用Java语言编程,这是一个纯的面向对象的程序设计语言。
将eclipse作为java集成开发环境(IDE)来使用,大大提高了编程的效率。
2.1抽象数据类型定义
2.1.1主界面类(Form.java)
“文法管理系统”界面。
主要设置全局字体、切换文本域输出内容以及联系其它类。
2.1.2文法类(Grammar.java)
存储文法的识别符号、终结符、非终结符,产生式规则。
记录一个非终结符最多有几条产生式规则用于建立推导。
2.1.3推导类(Derivation.java)
存储推导过程,计算出推导时间。
记录推导的步骤数和句子的标识符用于构造语法分析树。
判断句子的二义性。
2.1.4建树类(GrammarTree.java)
构造语法分析树,其根节点用于画数。
2.1.5画树类(PaintTree.java)
画出语法分析树。
2.1.6菜单类(GrammarMenu.java)
“文法管理系统”菜单,主要实现各个菜单选项的功能。
2.1.7过滤器类(TFileFilter)
在“打开文法”菜单选项弹出的文件选择器中过滤txt文件。
2.2主要程序流程图
2.2.1存储文法流程图
2.2.2推导句子流程图
2.2.3建树流程图
2.3UML图
三、详细设计
3.1抽象数据结构中的基本操作
3.1.1主界面类(Form.java)
classFormextendsJFrame
{
Grammarg;
//文法类
Derivationd;
//推导类
GrammarTreet;
//建树类
JTextAreaagrammar=newJTextArea();
//左侧文本域
JTextAreaatext=newJTextArea();
//右侧文本域
JScrollPanescrollgrammar=newJScrollPane(agrammar);
//左侧滚动条
JScrollPanescrolltext=newJScrollPane(atext);
//右侧滚动条
JPanelp=newJPanel();
//新窗口
publicForm()//构造函数
publicvoidinitGrammar(String[]input)//“打开文法”菜单选项调用
publicvoidswitchGra()//“显示文法”菜单选项调用
publicvoidswitchDer()//“显示推导”菜单选项调用
publicvoidshowPaintTree()//“显示语法分析树”菜单选项调用
publicvoidinitDerivation(Stringinput)//“建立推导”菜单选项调用
publicvoidinitTree()//建立语法分析树
publicstaticvoidinitGlobalFontSetting(Fontfont)//设置全局字体
classTreeFormextendsJFrame//新窗口显示语法分析树
}
3.1.2文法类(Grammar.java)
classGrammarNode//文法产生式规则
Stringleft;
//:
=左侧非终结符
String[]right;
=右侧产生式规则
classGrammar
GrammarNode[]grammar=newGrammarNode[100];
//存储产生式规则
String[]VN=newString[50];
//存储非终结符
String[]VT=newString[50];
//存储终结符
introw=0,vn=0,vt=0,maxrule=0;
//产生式规则个数非终结符个数终结符个数最多产生式规则数
publicGrammar(Stringinput[])//构造函数存储文法
publicStringgetGrammar()//输出文法
}
3.1.3推导类(Derivation.java)
classDerivationNode//推导
String[]str;
//存储推导
intstrlength,pos;
//推导符号个数最左非终结符号位置
DerivationNode(String[]s,intl,intp)//用于构造derivation[0]
DerivationNode(DerivationNoden)//拷贝构造函数
booleanequaltoStart(StringIDtarget[])//判断之前的推导是否正确
booleannext(Grammarg,intrule)//根据产生式规则进行变换变换失败返回false
classDerivation
Grammarg;
//用户给定文法
DerivationNode[]derivation;
//存储推导过程
String[]ID;
//标识符数组
intinputlength,step,idcount;
//句子长度推导步骤数记录标识符数组个数用于建树
privateString[]target,IDtarget;
//输入句子规范化输入
privatebooleanfinnish,reverse;
//推导是否完成是否改变产生式规则的顺序
privatelongstarttime;
//推导开始时间
privatelongendtime;
//推导结束时间
publicDerivation(GrammarG)//构造函数
privatebooleanisID(Stringtemp)//判断是否为标识符
publicvoidleftDerivation(Stringinput)//最左推导
privatevoidLeftDerivation(inti,booleanreverse)//最左推导调用的递归函数
publicStringgetDerivati