编译原理课程设计词法分析器附含源代码

  • 格式:doc
  • 大小:86.50 KB
  • 文档页数:7

下载文档原格式

  / 7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理-词法分析器的设计

一.设计说明及设计要求

一般来说,编译程序的整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。本课程设计即为词法分析阶段。词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。如保留字(关键字或基本字)、标志符、常数、算符和界符等等。

二.设计中相关关键字说明

1.基本字:也称关键字,如C语言中的if , else , while , do ,for,case,break,

return 等。

2.标志符:用来表示各种名字,如常量名、变量名和过程名等。

3.常数:各种类型的常数,如12,6.88,和“ABC”等。

4.运算符:如+ ,- , * , / ,%, < , > ,<= , >= 等。

5.界符,如逗点,冒号,分号,括号,# ,〈〈,〉〉等。

三、程序分析

词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字符地对源

程序进行

扫描,产生一个个单词序列,用以语法分析。词法分析工作可以是独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件做为语法分析程序的输入而继续编译过程。然而,更一般的情况,常将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则

调用该子程序。词法分析程序每得到一次调用,便从源程序文件中读入一

些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。

四、模块设计

下面是程序的流程图

五、程序介绍

在程序当前目录里建立一个文本文档,取名为in,所有需要分析的程序都写在此文本文档里,程序的结尾必须以“@”标志符结束。程序结果输出在同一个目录下,文件名为out,此文件为自动生成。本程序所输出的单词符号采用以下二元式表示:(单词种别,单词自身的值)如程序输出结果(57,"#")(33,"include")(52,"<")(33,"iostream") 等。

程序的功能:(1)能识别C语言中所有关键字(共32个)(单词种别分别为1 —32 ,详情见程序代码相关部分,下同)

(2)能识别C语言中自定义的标示符(单词种别为33)

(3)能识别C语言中的常数(单词种别为0)

(4)能识别C语言中几乎所有运算符(单词种别分别为41 —54)

(5)能识别C语言中绝大多数界符(单词种别分别为55 —66)

六、运行结果

输入文件in

运行结果(输出文件out)

七、设计体会

八、附录部分(程序代码)

单词符号类别编码单词符号类别编

单词符

类别

编码

单词

符号

类别

编码

提示:文件的打开和读写函数:

FILE *fp,*out; //定义文件指针

fp=fopen("in","r"))

如果打开文件"in"失败,则函数返回NULL,即fp=NULL,第二个参数“r”表示以只读方式打开,如果为”w”,则以可写方式打开

调用fgetc(fp)这个函数一次从fp所指向的文件读取一个字符

char ch=fgetc(fp);

想文件写字符的函数为fprintf(FILE * fp,写进的内容)

比如下面的调用fprintf(outfile,"abcd\n")是把字符串“abcd”写到文件outfile的末尾,并且在后面加上了一个换行标志

文件读写完成后要用函数fclose(fp)关闭。

源代码

#include "stdio.h"

#include "string.h"

#include "ctype.h"

void analzid(FILE *output,char *p)

{

int i=0;

int count=0;

if (isalpha(p[0]))

{if (strcmp(p,"if")==0) {fprintf(output,"(3,if)\n");}

else if(strcmp(p,"then")==0) {fprintf(output,"(4,then)\n");}

else if(strcmp(p,"else")==0) {fprintf(output,"(5,else)\n");}

else if(strcmp(p,"while")==0) {fprintf(output,"(6,while)\n");}

else if(strcmp(p,"do")==0) {fprintf(output,"(7,do)\n");}

else if(strcmp(p,"begin")==0) {fprintf(output,"(8,begin)\n");}

else if(strcmp(p,"end")==0) {fprintf(output,"(9,end)\n");}

else if(strcmp(p,"long")==0) {fprintf(output,"(10,long)\n");}

else if(strcmp(p,"switch")==0) {fprintf(output,"(11,switch)\n");} else if(strcmp(p,"case")==0) {fprintf(output,"(12,case)\n");}

else if(strcmp(p,"enum")==0) {fprintf(output,"(13,enum)\n");}

else if(strcmp(p,"register")==0) {fprintf(output,"(14,register)\n");} else if(strcmp(p,"typedef")==0) {fprintf(output,"(15,typedef)\n");} else if(strcmp(p,"char")==0) {fprintf(output,"(16,char)\n");} else if(strcmp(p,"extern")==0) {fprintf(output,"(17,extern)\n");} else if(strcmp(p,"return")==0) {fprintf(output,"(18,return)\n");} else if(strcmp(p,"union")==0) {fprintf(output,"(19,union)\n");}

else if(strcmp(p,"const")==0) {fprintf(output,"(20,const)\n");}

else if(strcmp(p,"float")==0) {fprintf(output,"(21,float)\n");}

else if(strcmp(p,"short")==0) {fprintf(output,"(22,short)\n");}

else if(strcmp(p,"unsigned")==0) {fprintf(output,"(23,unsigned)\n");} else if(strcmp(p,"continue")==0) {fprintf(output,"(24,continue)\n");} else if(strcmp(p,"for")==0) {fprintf(output,"(25,for)\n");}

else if(strcmp(p,"signed")==0) {fprintf(output,"(26,signed)\n");}