编译原理-词法分析器的设计
一. 设计说明及设计要求
一般来说,编译程序的整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。本课程设计即为词法分析阶段。词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。如保留字(关键字或基本字)、标志符、常数、算符和界符等等。
二. 设计中相关关键字说明 1. 基本字:也称关键字,如C语言中的 if , else , while , do ,for,case,break, return 等。
2. 标志符:用来表示各种名字,如常量名、变量名和过程名等。 3. 常数:各种类型的常数,如12,,和“ABC”等。 4. 运算符:如 + ,- , * , / ,%, < , > ,<= , >= 等。
5. 界符,如逗点,冒号,分号,括号,# ,〈〈 , 〉〉等。
三 、程序分析
词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字符地对源程序进行
扫描,产生一个个单词序列,用以语法分析。词法分析工作可以是独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件做为语法分析程序的输入而继续编译过程。然而,更一般的情况,常将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。词法分析程序每得到一次调用,便从源程序文件中读入一些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。 四 、模块设计
下面是程序的流程图
五 、 程序介绍
在程序当前目录里建立一个文本文档,取名为,所有需要分析的程序都写在此文本文档里,程序的结尾必须以“@”标志符结束。程序结果输出在同一个目录下,文件名为,此文件为自动生成。本程序所输出的单词符号采用以下二元式表示:(单词种别,单词自身的值)如程序输出结果 (57,\等。
程序的功能:(1) 能识别C语言中所有关键字(共32个)(单词种别分别为1 — 32 ,详情见程序代码相关部分,下同)
(2) 能识别C语言中自定义的标示符 (单词种别为 33) 能识别C语言中的常数 (单词种别为0)
能识别C语言中几乎所有运算符(单词种别分别为41 — 54)
(5) 能识别C语言中绝大多数界符 (单词种别分别为 55 — 66) 六 、运行结果 输入文件
运行结果(输出文件 ) 七 、 设计体会
八、附录部分(程序代码) 单词符号 if then 类别编码 3 4 单词符号 float short 类别编码 21 22 单词符号 + - 类别编码 31 32 单词符号 # . 类别编码 62 63 else while do begin end long switch case enum register typedef char extern return union const 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 unsigned continue for signed void default goto sizeof volatile auto double int struct break static 23 24 25 26 27 28 29 30 43 44 45 46 47 48 49 * / < > = := ( ) ; [ ] { } << >> “ 33 34 35 36 37 51 52 53 54 55 56 57 58 59 60 61 , : >= <= == != % 标识符 常数 64 65 39 38 41 42 40 1 2 提示:文件的打开和读写函数:
==0) {fprintf(outfile,\
else if(strcmp(p,\ {fprintf(outfile,\ else if(strcmp(p,\ {fprintf(outfile,\ else if(strcmp(p,\ {fprintf(outfile,\ else if(strcmp(p,\ {fprintf(outfile,\ else if(strcmp(p,\ {fprintf(outfile,\ else if(strcmp(p,\ {fprintf(outfile,\ else if(strcmp(p,\ {fprintf(outfile,\ else if(strcmp(p,\ {fprintf(outfile,\ else if(strcmp(p,\
FILE *fp,*out;
else if(strcmp(p,\ else if(strcmp(p,\ else if(strcmp(p,\ else if(strcmp(p,\ ; else if(strcmp(p,\
else {fprintf(outfile,\未定义\\n\ }
void main() {FILE *fp,*out; int i=0,x=0,y=0; int EA=0;
char ch,str[10000],idstr[10],systr[2]; if((fp=fopen(\
{printf(\ exit(0);}
if((out=fopen(\
{printf(\ exit(0);} ch=fgetc(fp);
while(ch!=EOF)
{str[i]=ch;str[i+1]='\\0';i++;ch=fgetc(fp);} i=0;
while(1) {
if(str[i]=='@') break; else
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')|| (str[i]>='0'&&str[i]<='9')||(str[i]=='_')) {idstr[x]=str[i];idstr[x+1]='\\0';x++;i++;EA=1;} else {
x=0;
if((strlen(idstr)!=0)&&(EA)) analzid(out,idstr); idstr[x]='\\0';
if(str[i]<'0'||(str[i]>'9'&&str[i]<'A')|| (str[i]>'Z'&&str[i]<'a')||str[i]>'z') {
if(str[i]!='!'&&str[i]!='='&&str[i]!='<'&&str[i]!='>') {
systr[y]=str[i];systr[y+1]='\\0';analzsy(out,systr);i++; }
else
if((str[i]=='!'&&str[i+1]=='=')||(str[i]=='='&&str[i+1]=='=')|| (str[i]=='>'&&str[i+1]=='=')||(str[i]=='<'&&str[i+1]=='=')|| (str[i]=='<'&&str[i+1]=='<')||(str[i]=='>'&&str[i+1]=='>')) {
systr[y]=str[i];systr[y+1]=str[i+1];systr[y+2]='\\0'; analzsy(out,systr);i++;i++; } else {
systr[y]=str[i];systr[y+1]='\\0';analzsy(out,systr);i++; }}}}
printf(\全部结果已经存入文档-----\\n\ fprintf(out,\完成--------\ fclose(fp); fclose(out); }
相关推荐: