一. 实验目的及实验环境
(1)实验目的:熟悉语法分析的过程,编写代码实现判断LL(1)文法
并判断一个句子是否属于该文法。
(2)实验环境:ubuntu14.04,使用的工具vim, gcc, gdb
二. 实验内容
(1)输入任意文法,消除左递归和公共左因子;
(2)打印文法的First和Follow集;
(3)判断是否是LL(1)文法,如果是则打印其分析表;
(4)输入一个句子,如果该句子合法则输出与句子对应的语法树;
能够输出分析过程中每一步符号栈的变化情况。
如果该句子非法则进行相应的报错处理。
三.方案设计
重要的数据结构
产生式的数据结构
/* 表示一条产生式 */
struct productive {
struct node *head;
/* 表示产生式的长度,如上个产生式的长度是4 */
unsigned length;
};
文法的数据结构
/* 文法 */
struct sentence {
struct productive *prod;
/* 产生式的实际长度 */
unsigned cnt;
/* 产生式表的长度 */
unsigned size;
}
First 和 follow 集的数据结构
/* ==================================================================
* 下面是非终结符的First follow 集合的数据结构
* ================================================================== */
struct ff_node {
/* 非终结符少的多,所以右移两位 */
char ne_sign[NODE_MAX>>2];
char first[NODE_MAX];
char follow[NODE_MAX];
/* 分别用最低位,次低位表示first, follow 集合有没有求完(1完) */
unsigned char f;
};
struct nes_table {
struct ff_node *table;
size_t cnt;
size_t size;
};
/* ================================================================== */
分析表的数据结构
/* ==================================================================
* 下面是分析表的结构
* =======================================