本次实验一共由四个部分组成,分别是词法设计、语法设计(包括递归下降和LL1)、语义设计以及窗口界面设计。

1. 词法分析

1)读入文件

2)设计词法分析函数LexicalAnalysis()

v SNL程序按照分类的不同进行存储,存储在temchar数组中,存储的信息包含类型,字符串、长度和位置。当遇到空格或者其他不同类型的字符时,进行长度清零,并位置下移。

v 调用takeToken()函数,进行Token序列的分析。

(2)设计Token序列生成函数takeToken()

v 每生成一个新的temchar数组元素,就调用takeToken()函数进行更加具体的分类,将分类后的结果存储在Token数组中,存储的信息包括行数、字符串和类型。

(3)进行Token序列的输出

v 通过类型的不同进行输出内容的调整,并存储到.txt文件中

2. 语法分析——递归下降法

1)语法树结构

2)树节点

3)函数调用关系

3. 语法分析——LL1方法

1)语法树及树节点结构同递归下降法

2)主要函数

LL(1)语法分析的主要函数有:Parse()、CreatLLlTable()、priosity()等

Parse()函数是最主要的函数。它利用LL(1)分析表和符号栈进行语法分析,并处理终极符不匹配和文件提前结束错误。函数处理完成后,得到整个语法树。

CreatLLlTab1e()用于创建LL(1)分析表。用二维数组表示LL(1)分析表,初始化二维数组所有元素为0,根据给定的LL(l)文法,对产生式编号。对于每个产生式,左部的非终极符作为行号,其Predict集中每个元素分别作为列号,二维数组中行号、列号对应的元素赋值为该产生式的编号。

Priosity()用于判断当前操作符的优先级。优先级由高到低排序为:乘法运算符>加法运算符>关系运算符>左括号>栈底标志END.

3)程序框图

4. 语义分析

(1)构造符号表和删除符号表

符号表的结构

类型标识符

变量标识符

过程标识符

类型内部表示

记录域表

形参信息表

局部符号表示意图

符号表的操作

A. 符号表的创建、删除和查找

创建:当前层数Level加1,表示创建了一个新的符号表,并不真正创建符号表;遇到新的符号表的第一个元素时,使scope[Level]指向它。

删除:当前层数Level减1,表示删除当前符号表。

查找:符号表的查找使用简单的顺序查表法。

B、符号表的局部化

每个局部化单位一个符号表,利用scope栈,栈的所有元素都指向一个局部符号表。

符号表的实现

A. 创建一个符号表

函数:void CreatTable()

功能:建立一个空的符号表table,层数加1,偏移初始化为0。

算法过程:Off赋值初始值initOff

B. 撤销一个符号表

函数:void DestroyTable ( )

算法过程:Level=Level-1

C. 登记标识符和属性到符号表

函数:bool Enter(string id,AttributeIR *AttribP,SymbTable **Entry,TreeNade* t)

算法说明:如下框图

A. 符号表中查找标识符

函数:bool FindEntry(string id,bool flag,SymbTable **Entry)

算法说明:如下框图

B. 在域表中查找域名

函数:bool FindField(string Id ,FieldChain *head ,FieldChain **Entry)

算法过程:从域表头开始,依次将节点中的标识符名字和id比较是否相同,直到找到此标识符或者到达表尾,若找到,返回真值,Entry为标识符在符号表中的位置,否则,返回值为假。

C. 打印符号表

函数: void Inputsymb()/void Inputdestroysymb()

(2)进行语义错误检查

l 类型分析处理函数

A. 函数:Type *TypeProcess(TreeNode *t)

B. 算法过程:如下框图

l 类型声明部分分析处理函数

函数:void TypeDecPart(TreeNode *t)

算法过程:如下框图

l 变量声明部分分析处理函数

函数:void VarDecList(TreeNode *t)

算法过程:如下框图

l 过程声明部分分析处理函数

函数: void ProcDecPart(TreeNode *t)

算法过程:如下框图

l 形参处理分析函数

函数:ParamTable *ParaDecList(TreeNosde *t)

算法过程:如下框图

l 语句序列分析处理函数

函数:void statement(TreeNode * t)

算法过程:如下框图

l 还有一些函数参与到语义错误分析中,如Expr(t,Ekind),arrayVar(t),recordVar(t)等等

5. 窗口设计

程序界面及运行截图

1. 词法分析运行截图

2. 语法分析运行截图

(1)递归下降

(2)LL1

3. 语义分析运行截图

4. 窗体运行截图

源程序核心代码

1. 词法分析

(1)LexicalAnalysis函数

2)takeToken函数

2.

语法分析——递归下降法

3.

语法分析——LL1方法

4. 语义分析

5. 窗口设计

举报/反馈

付贾一方的60133

20获赞 2粉丝
辛勤劳累的女大学生们写的研究报告合集
关注
0
0
收藏
分享