实验二 词法分析实验
第 PAGE \* Arabic \* MERGEFORMAT 12 页
实验二 词法分析
一、目的要求
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
二、实验分析
本实验以用户指定的想编译的以C语言编写的文件作为词法分析程序的输入数据。
在进行词法分析中,先自文件头开始以行为单位扫描程序,将该行的字符读入预先设定的一个数组缓冲区中,然后对该数组的字符逐词分割,进行词法分析,将每个词分割成关键字、标识符、常量和运算符四种词种,最终产生四个相对应的表,即关键字表、标识符表、常量表和运算符表,它们以文件的形式进行存储。除此之外,还产生一个编译后的文件,它指定了每个词在四个表中的位置。
三、实验过程
文件:
cpile.c 主程序文件
key.txt 关键字文件
operation.txt 运算符文件
id.txt 标识符文件
const.txt 常量文件
after_com.txt 编译后产生的文件
主要变量:
FILE *sfp,*nfp,*ifp,*kfp,*cfp,*pfp;
char ib[50][20] 标识符表(动态生成)
char cb[50][10] 常量表(动态生成)
char kb[44][10] 关键字表(预先定义好的)
char pb[36][5] 运算符表(预先定义好的)
主要的子函数名:
int number(char s[],int i); 数字处理函数
int letter(char s[],int i); 字符处理函数
int operation(char s[],int i); 运算符处理函数
void seti (char s[]); 标识符建立函数
void setc (char s[]); 常量建立函数
void cfile(char s1[], char s2[],int m); 将词和词所在表中位置写入编译后文件
void error1(char s[]); 字符处理出错报告
void error2(char s[]); 标识符处理出错报告
void error3(char s[]); 运算符处理出错报告
void openall(); 打开所有文件
void writeall(); 将四个表写入文件
void closeall(); 关闭所有文件
下面简要分析一下词法分析程序的运行流程:
#include
#include
#include
#include
#define SIZE 256
#define null 0
int line=0,error=0,mark1=0,mark2=0;
char *sname;
FILE *sfp,*nfp,*ifp,*kfp,*cfp,*pfp;
/**/
char ib[50][20];
char cb[50][10];
char kb[44][10]={"char","short","int","unsigned","long","float","double","struct","union","void",
"enum","signed","const","volatile","typedef","auto","register","static","extem",
"break","case","continue","default","do","else","for","goto",