资源简介
一:实验内容:
编写语法分析程序,实现对算术表达式的语法分析,要求所分析的算术表达式由如下的文法产生。
◆E->E+T|E-T|T
◆T->T*F|T/F|F
◆F->id|(E)|num
二:实验要求:
在对表达式进行分析的同时,输出所采用的产生式。
可以采用多种方法
◆编写递归调用程序,实现自顶向下的分析。
◆编写LL(1)语法分析程序,要求:
◇编程实现算法4.2,为给定的文法自动构造预测分析表
◇编程实现算法4.1,构造LL(1)预测分析程序,
◆编写语法分析程序,实现自底向上的分析,要求:
◇构造识别所有活前缀的DFA
◇构造LR分析表
◇编程实现算法4.3,构造LR分析程序
◆利用yacc自动生成语法分析程序,调用LEX自动生成的词法分析器程序

代码片段和文件信息
#include
#include
#include
#define PRO_NUM 11 //产生式个数
#define PRO_MAXLEN 8 //产生式最大长度
#define TER_NUM 9 //终结符个数
#define UNTER_NUM 5 //非终结符个数
#define F_MAXLEN 8 //FIRST集和FOLLOW集的大小
#define STR_MAXLEN 50 //待分析的输入表达式的最大长度
#define IDNUM_MAXLEN 10 //待分析的输入表达式中id和num的的最大长度
#define ERROR -1 //分析表项为空白,错误入口
#define SYNCH -2 //分析表项为同步信息synch,同步错误入口
#define ID 1 //字母标记
#define NUM 2 //数字标记
#define OTHER 0 //其他字符标记
#define TRUE 1
#define FALSE 0
#define NOTFOUND -1
typedef int Status; //返回状态类型
using namespace std;
char grammar[PRO_NUM][PRO_MAXLEN]; //文法表
char ter_symbol[TER_NUM]; //终结符表
char unter_symbol[UNTER_NUM]; //非终结符表
char FIRST[UNTER_NUM][F_MAXLEN]; //FIRST集
char FOLLOW[UNTER_NUM][F_MAXLEN]; //FOLLOW集
int M[UNTER_NUM][TER_NUM]; //LL(1)语法预测分析表
char str[STR_MAXLEN+1]; //输入缓冲区
deque s;
//构成LL(1)分析器基本函数
void Initial (void); //初始化
void Create_Analysis (void); //构造LL(1)语法预测分析表
void GetString (void); //获取待分析输入表达式
void Analyse_Output (void); //使用LL(1)语法预测分析表分析输入的表达式并输出分析结果
//LL(1)分析器辅助函数
int GetStrLen (void); //获取输入表达式的长度
Status Judge_Ter (char ch); //判断字符ch是否为终结符
Status Judge_Unter (char ch); //判断字符ch是否为非终结符
int Get_Ter_Num (char ch); //返回终结符ch在终结符表中的下标
int Get_Unter_Num (char ch); //返回非终结符ch在终结符表中的下标
Status In_FIRST (char A char ch); //判断终结符ch是否在非终结符A的FIRST集中
Status In_FOLLOW (char A char ch); //判断终结符ch是否在一个非终结符A的FOLLOW集中
void Output_Pro (int i); //打印分析过程中输出的产生式
void Output_Stack (void); //打印当前栈中的符号
void Output_Buffer (int ip); //打印当前输入缓冲区中的符号串
Status Judge_Id (char ch); //判断字符ch是否为构成id的字母
Status Judge_Num (char ch); //判断字符ch是否为构成num的数字
Status Judge_Exceed (void); //判断输入表达式中代表id和num的子串是否超过最大长度
int main ()
{
Initial(); //初始化
Create_Analysis(); //构造LL(1)语法预测分析表
GetString(); //获取待分析输入表达式
Analyse_Output (); //使用LL(1)语法预测分析表分析输入的表达式并输出分析结果
system(“pause“);
return 0;
}
void Initial (void) //初始化
{
int i j;
s.push_back(‘$‘);
s.push_back(‘E‘); //初始化栈:构造空栈,并压入‘$‘与‘E‘
//设置文法表,存储P代表E‘,Q代表T‘,e代表εi代表id,n代表num
strcpy (grammar[0] “E#TP#“); //E →TE‘
strcpy (grammar[1] “P#+TP#“); //E‘ →+TE‘
strcpy (grammar[2] “P#-TP#“); //E‘ →-TE‘
strcpy (grammar[3] “P#e#“); //E‘ →ε
strcpy (grammar[4] “T#FQ#“); //T →FT‘
strcpy (grammar[5] “Q#*FQ#“); //T‘ →*FT‘
strcpy (grammar[6] “Q#/FQ#“); //T‘ →/FT‘
strcpy (grammar[7] “Q#e#“); //T‘ →ε
strcpy (grammar[8] “F#i#“); //F →id
strcpy (grammar[9] “F#(E)#“); //F →(E)
strcpy (grammar[10] “F#n#“); //F →num
for (i = 0; i < UNTER_NUM; i++) //LL(1)语法预测分析表初始化:所有表项置为错误ERROR
for (j = 0; j < TER_NUM; j++)
M[i][j] = ERROR;
strcpy (ter_symbol “+-*/()in$“); //初始化终结符表
strcpy (unter_symbol “EPTQF“); //初始化非终结符表
//初始化FIRST集
strcpy (FIRST[0] “(in#“);
strcpy (FIRST[1] “+-e#“)
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 15166 2012-12-28 19:16 语法分析程序的设计与实现\语法分析器方法2.cpp
文件 11588 2012-12-28 21:11 语法分析程序的设计与实现\语法分析器方法3.cpp
文件 26908 2013-01-15 13:03 语法分析程序的设计与实现\语法分析实验报告.docx
文件 680042 2012-12-26 22:33 语法分析程序的设计与实现\语法分析程序的设计与实现.pdf
目录 0 2013-01-15 13:06 语法分析程序的设计与实现
----------- --------- ---------- ----- ----
733704 5
- 上一篇:BLDC 直流无刷电机驱动原理
- 下一篇:《编译原理》课后习题答案
相关资源
- 数学建模实验报告(八个全)
- 数字逻辑与数字系统实验报告
- 多媒体综合设计报告(附作品)
- ubuntu9.10 可加载内核模块和字符设备驱
- 操作系统 LRU算法 实验报告 及 程序代
- 迈克尔逊干涉仪的调整与使用实验报
- 利用启发式搜索解决八数码难题程序
- 比较两个字符串大小汇编语言源代码
- 编译原理LR(0)语法分析
- linux实验报告及心得体会
- 数据结构实验-魔王语言-源码加实验报
- 2FSK2PSK信号产生器实验实验报告
- 软件工程课程设计【网上选课系统】
- 表达式求值C 代码(附实验报告)
- 编译原理实验:词法分析,语法分析
- 湖南大学操作系统实验报告
- 编译原理语法分析器、词法分析器
- 哈夫曼树编码和译码实验报告+运行视
- 哈工大威海-嵌入式实验报告答案
- 银行储蓄系统实验报告
- 操作系统实验报告哲学家就餐问题、
- 北航研究生计网实验报告.rar
- PS作业 实验报告 11
- 数据结构算术表达式求值实验报告
- pl/0编译器 语法分析
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 软件项目管理实验报告
- 数字图像处理课程设计 实验报告
- 河北工业大学编译原理实验代码及实
评论
共有 条评论