你的学校 学 院
课程设计说明书
题
院
姓
学
目:
语法分析器的设计与实现
系:
名:
号:
专业班级:
任课教师:
马吉明
成
绩:
时间:
年 月 日至 年 月 日
1
2
你的学校 学 院
课程设计任务书
题目:
语法分析器的设计与实现
班级: 学号:
姓名:
主要内容
根据某一文法编制调试自顶向下语法分析器(递归下降分析程序、 LL
( 1 )分析程序),以便对任意输入的符号串进行自顶向下的语法分析。本次实
验的目的主要是加深对自顶向下的语法分析法的理解。
基本要求
采用文件操作,输入为 c 语言源程序,输出为经过语法分析的单词序列
或四元式形式的中间代码序列。
主要参考资料等:
《编译原理》
完 成 期 限:
指导教师签名:
课程负责人签名:
年 月 日
3
目录
1 算法分析与设计 ............................................................................................................................ 5
2 详细设计 ........................................................................................................................................ 6
3 关键代码 ........................................................................................................................................ 7
4 对本设计的简单评述、总结或体会...........................................................................................14
5 参考文献 ...................................................................................................................................... 14
4
1 算法分析与设计
·为文法 G 的每个非终结符号 U 构造一个递归过程,不妨命名
为 U 。
U 的产生式的右边指出这个过程的代码结构:
(1) 若是终结符号,则和向前看符号对照,若匹配则向前进一个
符号;否则出错。
(2) 若是非终结符号,则调用与此非终结符对应的过程。当 A 的
右部有多个产生式时,可用选择结构实现。具体为:
( 1 )对于每个非终结符号 U → u1|u2|…|un 处理的方法如下:
U( )
{
ch= 当前符号 ;
if(ch 可能是 u1 字的开头 ) 处理 u1 的程序部分 ;
else if(ch 可能是 u2 字的开头 ) 处理 u2 的程序部分 ;
…
else error()
}
( 2 )对于每个右部 u1 → x1x2…xn 的处理架构如下:
处理 x1 的程序;
处理 x2 的程序;
…
5
处理 xn 的程序;
( 3 )如果右部为空,则不处理。
( 4 )对于右部中的每个符号 xi
① 如果 xi 为终结符号:
if(xi= = 当前的符号 )
{
NextChar() ;
return;
}
else
出错处理
② 如果 xi 为非终结符号,直接调用相应的过程 xi()
说明: NextChar 为前进一个字符函数。
2.LL(1) 下降分析器
实验设计思想:利用 LL ( 1 )控制程序根据显示栈栈顶内容、
向前看符号以及 LL ( 1 )分析表,对输入符号串自上而下的分析。
2 详细设计
·程序输入 / 输出示例:
对下列文法,用递归下降分析法 /LL(1) 分析法, 对任意输入的符号串进行分析:
( 1 ) E → TG
( 2 ) G → +TG| — TG
6
( 3 ) G →ε
( 4 ) T → FS
( 5 ) S → *FS|/FS
( 6 ) S →ε
( 7 ) F → (E)
( 8 ) F → i
输出的格式如下:
1. 递归下降分析程序 /LL(1) 分析程序
2. 输入一以 # 结束的符号串 ( 包括 +-*/ () i#) :在此位置输入符号串例如: i+i*i#
3. 输出结果: i+i*i# 为合法符号串
4. 输出从文法开始符到句子的推导的全过程,或输出以下的分析过程:
步骤
分析栈
剩余输入串
所用产生式
1
E
i+i*i#
E →TG
3 关键代码
#include
#include
#include
//用到了字符串
处理函数 strcat
struct stack
//stack 堆栈用来
存放推倒所用的产生式
{
7
stack *top;
char value;
};
char pop(stack *pst)
//堆栈的出栈操
{
char e;
if(pst->top==pst)
{
printf("The stack is null.");
return 0;
}
else
e=pst->top->value;
pst->top--;
return e;
{
}
}
void push(stack *pst,char e)
//堆栈的压栈操
{
作
作
8