本次实验一共由四个部分组成,分别是词法设计、语法设计(包括递归下降和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. 窗口设计