河北工业大学编译原理.doc

上传人:s9****2 文档编号:558941691 上传时间:2023-01-27 格式:DOC 页数:35 大小:1.14MB
返回 下载 相关 举报
河北工业大学编译原理.doc_第1页
第1页 / 共35页
河北工业大学编译原理.doc_第2页
第2页 / 共35页
河北工业大学编译原理.doc_第3页
第3页 / 共35页
河北工业大学编译原理.doc_第4页
第4页 / 共35页
河北工业大学编译原理.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《河北工业大学编译原理.doc》由会员分享,可在线阅读,更多相关《河北工业大学编译原理.doc(35页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验报告实验一 词法分析程序实现一、实验目的与要求通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。二、实验设计语言中具有的单词包括五个关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。单词的分类:构造上述语言中的各类单词符号及其分类码表。表I 语言中的各类单词符号及其分类码表单词符号类别编码类别码的助记符单词值begin1BEGINend2ENDif3IFthen4THENelse5ELSE标识符6ID字

2、母打头的字母数字串整常数7INT数字串8LT=9LE=10EQ11NE12GT=13GE:=14IS+15PL-16MI*17MU/18DI识别表I所列语言中的部分单词的DFA及相关的语义过程将表I单词集中的整常数改为无符号常数,无符号常数的单词分类码助记符:UCON描述无符号数的正规文法和状态转换图:无符号数的右线性文法G1如下:无符号数 d余留无符号数无符号数 小数部分无符号数 d余留无符号数 d余留无符号数余留无符号数 十进小数余留无符号数 E指数部分余留无符号数 d余留无符号数 十进小数 E指数部分十进小数 d十进小数十进小数 d小数部分 d十进小数小数部分 d指数部分 d余留整指数指

3、数部分 +整指数指数部分 -整指数指数部分 d整指数 d余留整指数整指数 d余留整指数 d余留整指数余留整指数 d图所示为上述文法的状态转换图,其中编号0、1、2、6分别代表非终结符号、及。文法G1的状态转换图包含语义处理过程的识别无符号数的状态矩阵三、 源程序/扫描器/#include#include#include#include#include#define BEGIN 1#define END 2#define IF 3#define THEN 4#define ELSE 5#define ID 6#define INT 7#define LT 8#define LE 9#define

4、 EQ 10#define NE 11#define GT 12#define GE 13#define PL 14#define MI 15#define MU 16#define DI 17#define TOKEN_SIZE 64#define TAB_SIZE 5char TOKENTOKEN_SIZE;extern int lookup(char *);extern void out(int ,char*);extern void report_error();int GetChar(void);int EXCUTE(int,int);int LEX(void);#define LE

5、TTER 0#define DIGIT 1#define POINT 2#define OTHER 3#define POWER 4#define PLUS 5#define MINUS 6#define ClassNo 100 #define ClassOther 200#define EndState -1int w,n,p,e,d;int Class;int ICON;float FCON;static int CurrentState;char ch;/信息表保存5个关键字typedef struct int ad; char id6;info_ele;info_ele TabTAB_

6、SIZE=1,begin,2,end,3,if,4,then,5,else;void scanner_example(FILE *fp) /扫描器函数 int i,c; ch=fgetc(fp); if(isalpha(ch) /是否为字母 TOKEN0=ch; i=1; ch=fgetc(fp); while(isalnum(ch) /是否为字母或数字 TOKENi=ch; i+; ch=fgetc(fp); fseek(fp,-1,1); TOKENi=0; c=lookup(TOKEN); /调用输出函数out() if (c=0) out(ID,TOKEN); else out(c,T

7、OKEN); else if(isdigit(ch) /判断是否为整数 TOKEN0=ch; i=1; ch=fgetc(fp); while(isdigit(ch)|ch=.|ch=e|ch=-) TOKENi=ch; i+; ch=fgetc(fp); fseek(fp,-1,1); TOKENi=0; out(INT,TOKEN);LEX(); else /判断运算符 if(ch= |ch=n); /遇见空格、回车继续 else switch(ch) case =:out(EQ,=); break; case :ch=fgetc(fp); if(ch=)out(GE,=); else f

8、seek(fp,-1,1); out(GT,); break; case:ch=fgetc(fp); if(ch=) out(LE,) out(NE,); else fseek(fp,-1,1); out(LT,); break; case +:out(PL,+);break; case -:out(MI,-);break; case *:out(MU,*);break; case /:out(DI,/);break; default: report_error(); break; int lookup(char p) /查找是否为关键字 int i=0; for(i;iTAB_SIZE;i+

9、) if(!strcmp(Tabi.id,p)return (Tabi.ad); return 0; void out(int a,char *p) /输出结果 switch(a) case BEGIN: printf(BEGIN,%s)n,p);break; case END : printf(END,%s)n,p); break; case IF: printf(IF,%s)n,p);break; case THEN: printf(THEN,%s)n,p);break; case ELSE: printf(ELSE,%s)n,p);break; case ID: printf(ID,%s)n,p);break; case INT:printf(UCON,%s)n,p);break; case LT:printf(LT,%s)n,p);break; case LE:printf(LE,%s)n,p);break; case EQ:printf(EQ,%s)n,p);break;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号