河北工业大学编译原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告
组员:韦廷廷(112455)、熊敏(112456)、马昊(113042) 任课老师:吴清
一、任务概述
本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法。我们组的分工并不是词法分析、语法分析、语义分析每人负责一个,而是先确定每种分析按照哪一种方法实现,然后每个人写出自己的想法,按照自己的想法实验,最后总结到一起,有问题大家一起讨论,共同商量解决的办法。
二、系统设计
实验采用的实现方法和依据:
语言中的各类单词符号及其分类码表
实验采用的实现方法和依据:
文法:E → T | E+T | E-T T → F | T*F | T/F F → i | (E)
SLR(1)分析表
三、系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等)
(1)各.h和.c文件说明
Cifa.cpp的功能:字符串扫描识别。
Table.cpp的功能:存放SLR分析法需要用到的ACTION和GOTO表。
Yufa.cpp的功能:引用Cifa.cpp、Table.cpp两个文件进行语法、语义的分析。
(2)函数功能说明
词法分析部分函数说明:
int lookup (char *token) //比较是否是关键字
int GetChar(char ch) //每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。
int HandleError (void)//报错函数
int EXCUTE (int state, int symbol)//状态转换
int lookup (char *token) //比较是否是关键字
void out(int a,char *token)//输出函数
void scanner_example (FILE *fp)//词法分析
语法、语义部分函数功能说明:
void REPORT_ERROR()//报错函数
void Accept()//语法成功接受
int INDEX(char a)//获取当前字符串对应的索引
void yuyi(int n)//语义子程序
void INPUT(int a)//语法分析程序
(2) 数据结构、各种表格、变量等的说明
Cifa.cpp中:
char *KeyWordTable[MAX_KEY_NUMBER]={"begin","end", "if", "then", "else", KEY_WORD_END}; //数组指针关键字
int w,n,p,e,d;//w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记,
int Class;//标识单词类型
Table.cpp
#define MAXROW 16 //行数
#define MAXCOL 11 //列数
int Table[MAXROW][MAXCOL]
Yufa.cpp中
#define NUMBER 9//表达式的个数
int State[MAXState];//状态栈
int CURRENTSTATE=0;//标识当前状态
int LENGTH[NUMBER]={1,3,3,1,3,3,1,3,1};//表达式右边的长度
int Yes=0;//判断是否结束
int tag=0;//判断是否需要调用词法程序
四、系统工作过程及运行说明(使用操作指南)
程序使用:在工程里创建一个b.txt文件以识别算数运算表达式
五、源程序清单(要求有详细注释)和实例程序运行结果
源程序清单:
Cifa.cpp
#include
#define DIGIT 1
#define POINT 2 #define OTHER 3 #define POWER 4 # define ID 6
# define UCON 7 # define LT 8 # define LE 9
# define EQ 10
# define NE 11
# define GT 12
# define GE 13
# define IS 14
# define PL 15 //+
# define MI 16 //-
# define MU 17
# define DI 18
#define zuokuohao 19 #define youkuohao 20 #define jin 21
#define ClassOther 200
#define EndState -1
#define MAX_KEY_NUMBER 20 /*关键字的数量*/ #define KEY_WORD_END "END" /*关键字结束标记*/
char
*KeyWordTable[MAX_KEY_NUMBER]={"begin","end", "if", "then", "else", KEY_WORD_END};
//数组指针
char TOKEN[20];
char ch;
int w,n,p,e,d;//w尾数累加器,n小数位数计数器,p 指数累加器,e指数符号标记,
int Class;//标识单词类型
int ICON;
double FCON;
static int CurrentState=0;
int result;
int start=0;//指示程序的开始
int end=0;//指示程序的结束
int GetChar (void);
int EXCUTE (int,int);
int HandleOtherWord (void)
{
return ClassOther;
}
int HandleError (void)
{printf ("Error!\n"); return 0;}
int lookup (char *token) //比较是否是关键字
{
int n=0;
while (strcmp(KeyWordTable[n], KEY_WORD_END)) /*strcmp比较两串是否相同,若相同返回0*/
{
if (!strcmp(KeyWordTable[n], token)) /*比较token所指向的关键字和保留字表中哪个关键字相符*/
{
return n+1; /*根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值*/
break;
}
n++;
}
return 0; /*单词不是关键字,而是标识符*/
}
int GetChar (char a)
{
char c=a;
if(isdigit(c))
{
d=c-'0'; //字符c与字符0的ascii码差值,返回类型为一个整数
return DIGIT;}
if (c=='.') return POINT;
if (c=='E'||c=='e') return POWER;
if (c=='+') return PL;
if (c=='-') return MU;
return OTHER;
}
void report_error( )
{
printf("错误\n");
}
void out1(int a,char *token)//输出函数
{
switch (a)
{
case 1:printf("(BEGIN, )\n");break;
case 2:printf("(END, )\n");break;
case 3:printf("(IF, )\n");break;
case 4:printf("(THEN, )\n");break;
case 5:printf("(ELSE, )\n");break;
case 6: printf("(ID,%s)\n",token);break;
case 8:printf("(LT,%s)\n",token);break;
case 9:printf("(LE,%s)\n",token);break;
case 10:printf("(EQ,%s)\n",token);break;
case 11:printf("(NE,%s)\n",token);break;
case 12:printf("(GT,%s)\n",token);break;
case 13:printf("(GE,%s)\n",token);break;
case 14:printf("(IS,%s)\n",token);break;
case 15:printf("(PL,%s)\n",token);break;
case 16:printf("(MI,%s)\n",token);break;
case 17:printf("(MU,%s)\n",token);break;
case 18:printf("(DI,%s)\n",token);break;
case 19:printf("((, )\n");break;
case 20:printf("(), )\n");break;