1、课 程 实 验 报 告课程名称: 编译原理 专业班级: 学 号: 姓 名: 指导教师: 报告日期: word文档 可自由复制编辑目 录实验一 词法分析31 实验概述32 系统分析43 系统设计53.1词法分析DFA53.2系统流程图64 系统实现74.1 Head.h文件74.2 Main.c文件95 系统评价195.1关键字分析195.2标识符分析205.3常量分析205.4界符分析205.5运算符分析215.6其他字符分析215.7错误记录225.8完整词法分析输出22实验二 语法分析241 问题描述242 算法和数据结构设计243 C语言程序实现254 程序测试415 实验总结及心得体会
2、44实验一 词法分析1 实验概述此次实验要实现词法分析器,要求输入单词序列,输出是别的单词的二元组序列。选择计算机高级程序语言比如C语言,运用恰当的词法分析技术线路,设计和实现其对应的词法分析器。建议编程语言,选择计算机程序设计课程所采用的语言。要求分析器输出结果存入到磁盘文件中,具有出错处理功能。提示技术线路选择如下两种之一: 正则式NFADFAmin DFA程序设计或 正则文法NFADFAmin DFA程序设计2 系统分析拿到实验要求后,首先进行了背景分析。由于这次实验选择做C语言的词法分析,首先对C语言的单词分类进行了解。C语言单词分为标识符、关键字、常量(整型常量、浮点型常量)、运算符
3、、界符,另外还有一些其他字符。单词种类定义或内容标识符以字母或下划线打头的,字母、数字、下划线串关键字”include”,”auto”,”break”,”case”,”char”,”const”,”continue”,”default”,”do”,“double”,”else”,”enum”,”extern”,”float”,”for”,”goto”,”if”,”int”,”long”,“register”,”return”,”short”,”signed”,”sizeof”,”static”,”struct”,”switch”,“typedef”,”union”,”unsigned”,”vo
4、latile”,”while”,”main”,”void”,”int”,“char”,”printf”,”scanf”常量数字串(整型),或者两个数字串中间用小数点链接形成的串(浮点型)运算符+,-,*,/,=,=,=!&|;char sigopLENSIGOP = ;char otherLENOTHER = #.%;char word20,ch;int flag;int flag1;FILE *fp;FILE *out;FILE *fpkey;FILE *fpid;FILE *fpdigi;FILE *fpdel;FILE *fpop;FILE *fpother;FILE *fperr;in
5、t Deals1(char *word);int Deals2Int(char *word);int Deals2Float(char *word);int DealDel(ch);int DealOp(char *word);int DealErr(char ch);int DealErrString(char *word);int DealOther(char ch);int IsSigOp(char ch);int IsDblOp(char ch);int IsOp(char *word);int IsAlpha(char c);int IsNum(char c);int IsKey(c
6、har *word);int IsOther(char ch);int IsDel(char ch);4.2 Main.c文件#include #include #include #include #include head.h/*return 1 if c is alpha*/*else return 0*/int IsAlpha(char c) if(c = a) & (c = A) & (c = 0) & (c = 9) return 1; else return 0;/*return 2 if word is key*/*return 1 if word is id*/*else re
7、turn 0*/int IsKey(char *word) int m,i; for(i=0;iLENKEY-2;i+) if(strcmp(word, keyi) = 0) if(i = 0) return 2; return 1; return 0;/*return 1 if c is Del*/*else return 0*/int IsDel(char ch) int i; for(i=0;i=LENDEL;i+) if(ch = deli) return 1; return 0;/*return 1 if c is Other*/*else return 0*/int IsOther
8、(char ch) int i; for(i=0;i=LENOTHER-2;i+) if(ch = otheri)return 1; return 0;/*return 1 if word is op*/*else return 0*/int IsOp(char *word) int i; for(i=0;i=LENOP-2;i+) if(strcmp(word, opi) = 0)return 1; return 0;/*return i+1 if the first character of word is sigop*/*else return 0*/int IsSigOp(char c
9、h) int i; for(i=0;i=LENSIGOP-2;i+) if(ch = sigopi)return i+1; return 0;/*return i+1 if the first character of word is dblop*/*else return 0*/int IsDblOp(char ch) int i; for(i=0;i=LENDBLOP-2;i+) if(ch = dblopi)return i+1; return 0;/*printf key or id*/int Deals1(char *word) int i; for(i=0;i=LENKEY-2;i
10、+) if(strcmp(word, keyi) = 0) /fprintf(out, %st%dt1(关键字)n,word,i+1); /fprintf(fpkey, %st%dt1(关键字)n,word,i+1); fprintf(out, %st1(关键字)n,word); fprintf(fpkey, %st1(关键字)n,word); return i+1; fprintf(out, %st2(标识符)n,word); fprintf(fpid, %st2(标识符)n,word); return 0;/*printf digi int*/int Deals2Int(char *wor
11、d) fprintf(out, %st3.1(整型常量)n,word); fprintf(fpdigi, %st3.1(整型常量)n,word); return 0;/*printf digi float*/int Deals2Float(char *word) fprintf(out, %st3.2(浮点型常量)n,word); fprintf(fpdigi, %st3.2(浮点型常量)n,word); return 0;/*printf del*/int DealDel(ch) int i; for(i=0;i=LENDEL;i+) if(ch = deli) /fprintf(out,
12、%ct%dt4界符n,ch,i+1); /fprintf(fpdel, %ct%dt4界符n,ch,i+1); fprintf(out, %ct4(界符)n,ch); fprintf(fpdel, %ct4(界符)n,ch); return i+1; return 0;/*printf op*/int DealOp(char *word) int i; for(i=0;i=LENOP-2;i+) if(strcmp(word, opi) = 0) /fprintf(out, %st%dt5运算符n,word, i+1); /fprintf(fpop, %st%dt5运算符n,word, i+1
13、); fprintf(out, %st5(运算符)n,word); fprintf(fpop, %st5(运算符)n,word); return i+1; return 0;/*printf other*/int DealOther(char ch) int i; for(i=0;i-*/i(#”用1表示,“”用-1表示,“=”用0表示,而表中的空格部分用2表示。3.程序框架图2.1 图2.1 程序框架图3 C语言程序实现#include #include #include #define TRUE 1#define FALSE 0#define RULE_NUM 3#define VT_NU
14、M 8typedef int bool;char analyse_Stack30;/char *firstVT(char c);/char *lastVT(char c);/bool test_vt(char c);void grammar_analysis();bool isVN(char c);bool isVT(char c);char relation(char,char);int locate(char);int rule_match(char *);/void word_analysis();void scanner(void);bool letter_or_underline(char);/judge if ch is az or A Zbool digit(char); /judge if ch is 09bool test_seperator(char);char grammar1020;char rules78;char priorit