河北工业大学编译原理实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 #include #include #include #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;

相关文档
最新文档