文档介绍:“编译原理课程设计”
基于LL(1)方法的语法分析程序
姓名:
学号:
学院:信息科学与工程学院
班级:09级科学2班
指导教师:
编译环境:VS2010
日期:
课程设计目的
设计、编制和调试一个典型的语法分析方法,进一步掌握常用的语法分析方法。
要求
根据LL(1)分析法编写一个语法分析程序,可根据自己实际情况,选择以下一项作为分析算法的输入:
;
(α)和FOLLOW(U)集合,由程序自动生成文 法的分析表M;
,由程序自动构造文法的分析表M。
(2)所开发的程序可适用于不同的文法和任意输入串,且能判断该文法是否为LL(1)文法。
(3)如完成前两项,可增加运行实例,对于输入的文法和符号串,所编制的语法分析程序应能正确判断此串是否为文法的句子,并要求输出分析过程。
设计思想
该程序可分为如下几步:
设计文法
(2)判断正误
(3)若无误,判断是否为LL(1)文法
(4)若是,构造分析表;
(5)由总控算法判断输入符号串是否为该文法的句型。
四、主要变量说明
‘^ ’表示空
int count=0 分解的产生式的个数
int number 所有终结符和非终结符的总数
char start 开始符号
char termin[50] 终结符号
char non_ter[50] 非终结符号
char v[50] 所有符号
char left[50] 左部
char right[50][50] 右部
char first[50][50],follow[50][50] 各产生式右部的FIRST和左部的 FOLLOW集合
char first1[50][50] 所有单个符号的FIRST集合
char select[50][50] 各单个产生式的SELECT集合
char f[50],F[50] 记录各符号的FIRST和FOLLOW是否已求过
char empty[20] 记录可直接推出^的符号
char TEMP[50] 求FOLLOW时存放某一符号串的FIRST集合
int validity=1 表示输入文法是否有效
int ll=1 表示输入文法是否为LL(1)文法
int M[20][20] 分析表
char choose 用户输入时使用
char empt[20] 求_emp()时使用
char fo[20] 求FOLLOW集合时使用
int in(char c,char *p) 判断一个字符是否在指定字符串中
char c() 得到一个不是非终结符的符号
void recur(char *point) 分解含有左递归的产生式
void non_re(char *point) 分解不含有左递归的产生式
char grammer(char *t,char *n,char *left,char right[50][50]) 读入一个文法
void merge(char *d,char *s,int type) 将单个符号或符号串并入另一符号串
void emp(char c) 求所有能直接推出^的符号
int _emp(char c) 求某一符号能否推出‘^ ’
int judge() 判断读入的文法是否正确
void first2(int i) 求单个符号的FIRST
void FIRST(int i,char *p) 求各产生式右部的FIRST
void FOLLOW(int i) 求各产生式左部的FOLLOW
int ll1() 判断读入文法是否为一个LL(1)文法
void MM() 构造分析表M
void syntax() 总控算法
void menu() 一个用户调用函数
算法描述
输入文法的终结符,非终结符,开始符,和产生式,以字符数组分别记录终结符,非终结符,开始符和产生式
通过检查产生式格式是否符合要求,测试输入产生式是否合法
如果合法,判断是否有递归,进而判断直接递归还是间接递归,使用设置好的临时变量(非终结符),消除递归,统计新产生式个数,归并新的非终结符,终结符,若没有递归存在,保持其原值量;若不符合,则终止
化解产生式,求firth,follow,select集,判断是否LL(1),构造分析表
使用分析表分析输入的句型,并监视分析过程
结束
程序结构
第一部分:源文件
/*******************************************
主函数
*****************************************