词法分析.docx
- 文档编号:3245787
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:13
- 大小:84.66KB
词法分析.docx
《词法分析.docx》由会员分享,可在线阅读,更多相关《词法分析.docx(13页珍藏版)》请在冰豆网上搜索。
词法分析
课程设计说明书
设计题目:
词法分析程序设计
专业:
软件工程班级:
2010-2
设计人:
XXX
山东XX大学
2013年6月15日
课程设计任务书
学院信息科学与工程学院专业软件工程班级2010-2姓名XXX
一、课程设计题目:
词法分析程序设计
二、课程设计主要参考资料
(1)韩太鲁等,编译原理.石油大学出版社.2007.9
(2)XX文库
(3)
三、课程设计应解决的主要问题:
(1)词法分析程序
(2)容器Vector的使用
(3)
(4)
四、课程设计相关附件(如:
图纸、软件等):
(1)
(2)
五、任务发出日期:
2013-4-5课程设计完成日期:
2013-5-20
指导教师签字:
系主任签字:
指导教师对课程设计的评语
成绩:
指导教师签字:
年月日
词法分析器实验报告
一、设计目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
二、设计要求
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
三、设计说明(含主要算法的流程图)
·stringGetText();
提取文本文件中的信息。
·StringGetWord(stringstr,inti,int&j);
//获得一个单词符号,从位置i开始查找。
并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。
·intDeleteNull(stringstr,inti);
//第一个参数为目标字符串,第二个参数为开始位置返回值为连续的空格和换行后的第一个有效字符在字符串的位置
·boolIsBoundary(stringstr,inti);
//判断i当前所指的字符是否为一个分界符,是的话返回真,反之假
·boolIsOperation(stringstr,inti);
//判断i当前所指的字符是否为一个运算符,是的话返回真,反之假
·voidOutFile(vector
//此函数将一个pair数组输出到一个文件中
·vector
//此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组
·boolIsKey(stringstr);
//此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假
程序流程图:
y
n
y
n
y
n
四、实验源代码:
#include
#include
#include
#include
#include
usingnamespacestd;
//用来存储目标文件名
stringfile_name;
//提取文本文件中的信息。
stringGetText();
//获得一个单词符号,从位置i开始查找。
//并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。
stringGetWord(stringstr,inti,int&j);
//第一个参数为目标字符串,第二个参数为开始位置
//返回值为连续的空格和换行后的第一个有效字符在字符串的位置
intDeleteNull(stringstr,inti);
//判断i当前所指的字符是否为一个分界符,是的话返回真,反之假
boolIsBoundary(stringstr,inti);
//判断i当前所指的字符是否为一个运算符,是的话返回真,反之假
boolIsOperation(stringstr,inti);
//此函数将一个pair数组输出到一个文件中
voidOutFile(vector
//此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组
vector
//此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假
boolIsKey(stringstr);
intmain()
{
stringcom1="";
stringcom2="\n";
stringfileline=GetText();
intbegin=0,end=0;
vector
while(true)
{
if(begin>=strlen(fileline.c_str()))
break;
begin=DeleteNull(fileline,begin);
stringnowString;
nowString=GetWord(fileline,begin,end);
if(end==-1)
{
array.push_back(nowString);
break;
}
if(nowSpare(com1)&&nowSpare(com2))
array.push_back(nowString);
begin=end+1;
}
vector
mid_result=analyst(array);
OutFile(mid_result);
cout<<"词法分析完毕,二元组保存在"< ! \n"; getchar(); getchar(); return1; } //提取文本文件中的信息 stringGetText() { stringfile_name1; cout<<"请输入你要分析的文件名(包括路径和后缀名): "; cin>>file_name1; ifstreaminfile(file_name1.c_str(),ios: : in); if(! infile) { cout<<"无法打开文件"< ! ! "< exit(-1); } cout< charf[1000]; infile.getline(f,1000,EOF); infile.close(); returnf; } //获得一个单词符号,从位置i开始查找。 //并且有一个引用参数j,用来返回这个单词最后一个字符在原字符串的位置。 stringGetWord(stringstr,inti,int&j) { stringno_use("(){},;\n+=*/-<>\"'! "); j=str.find_first_of(no_use,i); if(j==-1) { returnstr.substr(i); } if(i! =j) j--; returnstr.substr(i,j-i+1); } //第一个参数为目标字符串,第二个参数为开始位置 //返回值为连续的空格和换行后的第一个有效字符在字符串的位置 intDeleteNull(stringstr,inti) { for(;;i++) if(str[i]! =''&&str[i]! ='\n') returni; } //判断i当前所指的字符是否为一个分界符,是的话返回真,反之假 boolIsBoundary(stringstr,inti) { intt; chararr[7]={',',';','{','}','(',')','\"'}; for(t=0;t<7;t++) if(str[i]==arr[t]) returntrue; returnfalse; } //判断i当前所指的字符是否为一个运算符,是的话返回真,反之假 boolIsOperation(stringstr,inti) { intt; chararr[7]={'+','-','*','/','=','<','>'}; for(t=0;t<7;t++) if(str[i]==arr[t]) returntrue; returnfalse; } //此函数将一个个字符串数组输出到一个文件中 voidOutFile(vector { cout<<"请输入你要存入的文件名(包括路径和后缀名): "; cin>>file_name; ofstreamoutfile(file_name.c_str(),ios: : out); if(! outfile) { cerr<<"无法打开文件"< ! ! "< exit(-1); } cout< outfile<<"单词"<<"<---+--->"<<"种类"< inti; for(i=0;i { outfile< } outfile.close(); return; } //此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组 vector { vector inti; for(i=0;i { if(vec[i].size()==1) { if((vec[i]==">"||vec[i]=="<"||vec[i]=="! ")&&vec[i+1]=="=") { stringjk=vec[i]; jk.append(vec[++i],0,1); pai
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析