编译原理实验报告三
编译原理实验报告
题目词法分析程序的构造学院
专业
班级
学号
学生姓名
指导教师
西安思源学院教务处制
二〇一年
实验三词法分析程序的构造
一、实验目的
1 掌握C++编译程序的使用方法
2 掌握C++编译程序的总体结构
3 掌握C++编译程序的词法分析程序
4 改编总控程序和词法分析程序
二、实验环境
Microsoft Visual C++ 6.0
三、实验内容
1 单词的分类:
可将所有标识符归为一类;将常数归为另一类:保留字、界符、运算符符则可采取一词一类。
2 符号表的建立
可事先建立一保留字表,以备识别保留字时进行查询。变量名表及常数表则在词法分析过程中建立。
3 单词串的输出形式:
所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该常数(整数)的二进制形式)。对于保留字、界符和运算符,由于采用一词一类的编码方式,所以仅需在二元式的CLASS 字段上放置相应的单词的类别码,VALUE字段则为“空”。(或:为便于查看由词法分析程序输出的单词串也可以在CLASS字段上放置单词符号串本身)。
4 编写上述词法分析程序
四、设计说明
void analyse(FILE *fpin){
string arr="";
while((ch=fgetc(fpin))!=EOF) {
arr="";
if(ch==' '||ch=='\t'||ch=='\n'){}
else if(IsLetter(ch)){
while(IsLetter(ch)||IsDigit(ch)) {
if((ch<='Z')&&(ch>='A')) ch=ch+32;
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
if (Iskey(arr)){cout< else cout< } else if(IsDigit(ch)) { while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){ arr=arr+ ch; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); cout< } else switch(ch){ case'+': case'-' : case'*' : case'=' : case'/' :cout< case'(' : case')' : case'[' : case']' : case';' : case'.' : case',' : case'{' : case'}' :cout< case':' :{ch=fgetc(fpin); if(ch=='=') cout<<":="<<"\t$运算符"< else {cout<<"="<<"\t$运算符"< fseek(fpin,-1L,SEEK_CUR);} }break; case'>' :{ch=fgetc(fpin); if(ch=='=') cout<<">="<<"\t$运算符"< if(ch=='>')cout<<">>"<<"\t$输入控制符"< else {cout<<">"<<"\t$运算符"< fseek(fpin,-1L,SEEK_CUR);} }break; case'<' :{ch=fgetc(fpin); if(ch=='=')cout<<"<="<<"\t$运算符"< else if(ch=='<')cout<<"<<"<<"\t$输出控制符"< else if(ch=='>') cout<<"<>"<<"\t$运算符"< else{cout<<"<"<<"\t$运算符"< fseek(fpin,-1L,SEEK_CUR);} }break; default : cout< } } } void main(){ char in_fn[30]; FILE * fpin; cout<<"请输入源文件名(包括路径和后缀名):"; for(;;){ cin>>in_fn; if((fpin=fopen(in_fn,"r"))!=NULL) break; else cout<<"文件路径错误!请输入源文件名(包括路径和后缀名):"; } cout<<"\n********************分析如下*********************"< fclose(fpin); } 分析代码 #include #include char ch[2000]; char a[2000]; char b[2000]; char c[2000]; int i,j,k,t; void main() { void find_word(); void show_all(); void Input(); Input(); cout<<"运行结果如下"< find_word(); show_all(); } 运行结果: 五、实验总结 通过这次实验使我对词法分析有了更好的了解,掌握词法分析的基本原理和方法。