分析下列代码继续补充给出生成构成SLR1分析器功能的各函数代码及调用的下面代码中未给的函数。 public class SLRNode public string Left; public string Right; public SLRNodestring Left string Right
该代码实现了构建SLR(1)分析器所需的各个功能函数,包括:
-
SLRNode类:用于存储产生式和项目。
-
SLRitemsets类:用于存储项目集。
-
DFA结构体:用于存储DFA中的一条边。
-
Table类:用于存储分析表中的一个结点。
-
Analyze类:用于存储分析过程中的状态栈、符号栈、输入串和所用产生式。
-
Buildprod函数:用于读入文法并构建产生式和项目。
-
Creteitemsets函数:用于构建项目集和DFA。
-
Closure函数:用于求一个项目集的闭包。
-
Go函数:用于求一个项目集在某个符号下的转移。
其中,Buildprod函数读入文法并构建产生式和项目,具体实现如下:
-
将拓广文法开始符号S'加入产生式列表SLRproNum中。
-
遍历文法中的每一行,对于每一行的产生式,将其左部非终结符加入非终结符集合Nchar中,将其右部加入产生式列表SLRproNum中。
-
对于每个产生式,构造其所有可能的项目,并加入项目列表SLRobjNum中。
-
将项目集合的第一个项目集初始化为包含拓广文法开始符号的闭包,然后循环遍历项目集合中的每个项目集,对于每个项目集,遍历所有终结符和非终结符,求出它们的Go函数,并判断该函数是否已经在项目集合中出现过,如果出现过,则直接使用该项目集的序号,否则新建一个项目集,并将该函数加入项目集合中。同时,将该函数作为DFA中的一条边加入DFA数组中。
Creteitemsets函数用于构建项目集和DFA,具体实现如下:
-
将项目集合的第一个项目集初始化为包含拓广文法开始符号的闭包。
-
循环遍历项目集合中的每个项目集,对于每个项目集,求出其所有可能的Go函数,并判断该函数是否已经在项目集合中出现过,如果出现过,则直接使用该项目集的序号,否则新建一个项目集,并将该函数加入项目集合中。同时,将该函数作为DFA中的一条边加入DFA数组中。
Closure函数用于求一个项目集的闭包,具体实现如下:
-
将该项目集中的所有项目加入闭包中。
-
循环遍历闭包中的每个项目,对于每个项目,如果其后面的符号为非终结符,则将该非终结符对应的所有产生式的所有可能的项目加入闭包中。
Go函数用于求一个项目集在某个符号下的转移,具体实现如下:
-
遍历该项目集中的每个项目,对于每个项目,如果其后面的符号为给定符号,则将其下一个项目加入转移结果中。
-
对转移结果求闭包
原文地址: https://www.cveoy.top/t/topic/hjTY 著作权归作者所有。请勿转载和采集!