C++实现LL1语法分析:first集、follow集与分析表

7 下载量 74 浏览量 更新于2024-06-28 收藏 66KB DOC 举报
"LL1语法分析c++实现文档,包含了first集、follow集、分析表和分析栈的实现代码" 本文档是关于使用C++实现LL1语法分析的方法,涉及了编译原理中的核心概念。LL1分析是一种自左向右、逐字符扫描的分析方法,其中"1"表示只使用当前栈顶一个符号的下一个输入符号来决定分析动作。以下是该实现的关键知识点: 1. **数据结构**: - `pRNode` 结构体代表产生式右部的节点,包含一个整型游标`intCursor`和指向下一个节点的指针`next`。 - `pNode` 结构体表示产生式,包括游标、右部长度以及指向产生式右部头的指针。 - `Vn` 和 `Vt` 数组分别存储非终结符和终结符,`vnNum` 和 `vtNum` 记录它们的数量。 - `PNodeP` 存储所有产生式的数组,`PNum` 是产生式的数量。 - `buffer` 用于存储待分析的符号串,`st` 是分析栈。 - `collectNode` 结构体表示first集和follow集中的元素,包含一个整型变量和指向下一个元素的指针。 2. **first集和follow集**: - first集是对于非终结符,它能以该非终结符开始的所有终结符序列的集合。 - follow集是对于非终结符,当它出现在句柄的左侧时,可能接在它后面的终结符集合。 - `first` 和 `follow` 数组用于存储这些集合,`AddFirst` 函数用于向first集中添加元素,`HaveEmpt` 可能是检查first集是否包含空字符。 3. **分析表**: - `analyseTable` 用于存储分析动作,是一个二维数组,其中列数是终结符的数量加1(多一列用于处理结束标记),行数是非终结符的数量。 - 分析表的构造基于first集和follow集,用于确定何时进行归约和何时接受输入。 4. **分析栈**: - `analyseStack` 存储分析过程中的符号,`topAnalyse` 是栈顶指针。 - 分析过程中,新的非终结符或终结符会被压入栈中,当遇到与分析表匹配的规则时,进行归约操作。 5. **函数**: - `Init()` 初始化相关数据结构。 - `IndexCh()` 根据字符返回其在终结符数组中的索引。 - `InputVt()` 和 `InputVn()` 分别输入终结符和非终结符。 - `ShowChArray()` 输出Vn或Vt的内容,便于调试。 - `InputP()` 输入产生式,并通过 `CheckP()` 检查其合法性。 - `First()` 和 `AddFirst()` 分别计算和更新first集。 - 其他未列出的函数可能涉及到计算follow集和构造分析表。 6. **LL1分析流程**: - 首先,输入文法的非终结符、终结符和产生式,构建first集和follow集。 - 然后,根据first集和follow集生成分析表。 - 接着,将起始符号压入分析栈,从输入串的第一个字符开始分析,根据分析表进行移进或归约操作。 - 当输入串处理完且分析栈仅剩文法的起始符号时,分析成功。 以上就是LL1语法分析的基本原理和C++实现的关键点。这个实现涵盖了编译器设计的核心部分,是理解编译器工作原理的重要参考。