编译原理 简单样本语言的词法分析器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
昆明理工大学信息工程与自动化学院学生实验报告
(2012 —2013 学年第 1 学期)
课程名称:编译原理开课实验室:信自楼44 年月日
一、实验目的及内容
设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。
二、实验原理及基本技术路线图(方框原理图或程序流程图)
对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
W INDOWS下的VISUAL C++6.0;
四、实验方法、步骤(或:程序代码或操作过程)
#include
#include
using namespace std;
#define MAX 22
char ch =' ';
string key[15]={"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat"};
int Iskey(string c){ //关键字判断
int i;
for(i=0;i if(key[i].compare(c)==0) return 1; } return 0; } int IsLetter(char c) { //判断是否为字母 if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsDigit(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } 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********************分析如下*********************"<