编译原理实验1.docx
- 文档编号:4143730
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:9
- 大小:116.90KB
编译原理实验1.docx
《编译原理实验1.docx》由会员分享,可在线阅读,更多相关《编译原理实验1.docx(9页珍藏版)》请在冰豆网上搜索。
编译原理实验1
编译原理实验1
广州大学学生实验报告
开课学院及实验室:
年月日
学院
计算机科学与教育软件学院
年级/专业/班
姓名
学号
实验课程名称
编译原理实验
成绩
实验项目名称
词法分析
指导老师
实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
针对表达各类词语的一组正规表达式,设计一个确定化的最简的有限自动机,对输入的符号串进行单词划分及词类识别。
实验内容
将词法分析器分解为以下几个部分:
1.正规表达式的解析:
将正规表达式中的符号分解为常量字符、正规表达式标识符和正规表达式运算符,然后基于正规表达式运算将正规表达式分解为更小的正规表达式(通过正规表达式运算符进行串接)。
2.正规表达式到NFA的转换:
根据转换规则,基于正规表达式运算,将正规表达式转换为非确定有限自动机,并确定各类词的终止状态。
3.NFA的确定化:
通过计算各状态的传递闭包,将NFA确定化,并确定各类词的终止状态。
4.最小化:
通过子集法,求得最简的确定有限自动机,并确定各类词的终止状态。
例如:
分析C语言子集的词法
1)关键字
mainifelseintreturnvoidwhile(都是小写)
2)专用符号
=+—*/<<=<>===!
=;:
,{}[]()
3)其他模式(正规表达式)
STRING:
:
="[^"]*
ID:
:
=letter(letter|digit)*
INT:
:
=digitdigit*
letter:
:
=a|…|z|A|…|Z
digit:
:
=0|…|9
4)空格由空白、制表符和换行符组成
空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。
部分单词符号对应的种别码
#include
usingnamespacestd;
intmain(){
inti=0,j,k=0;//k判断是保留字还是id
chara[7][10]={"main","if","else","int","return","void","while"};//保留字数组
chars;
chartoken[40]={"\0"};
cout<<"请输入字符"< s=getchar(); while(s! =EOF){//不是结束字符 if(s==''||s=='\n'||s=='\t'){//过滤空格,换行 s=getchar(); } elseif((s>='a'&&s<='z')||(s>='A'&&s<='Z')){//判断是id还是保留字 token[i++]=s; s=getchar(); while((s>='a'&&s<='z')||(s>='A'&&s<='Z')||(s>='0'&&s<='9')){//取接下来字符 token[i++]=s; s=getchar(); } for(j=0;j<7;j++){//判断是否为保留字 if(strcmp(token,a[j])==0){ cout< k=1; break; } } if(k==0){//为id cout<<"10,"< } memset(token,0,sizeof(token));//获取数组清零 i=0; k=0; } elseif(s>='0'&&s<='9'){//判断INT intflag=1; while(flag){ token[i++]=s; s=getchar(); if(! (s>='0'&&s<='9')){//不是数字 flag=0; cout<<"20,"< memset(token,0,sizeof(token)); i=0; } } } elseif(s=='='){//判断= s=getchar(); if(s=='='){ cout<<"39,=="< s=getchar(); }else{cout<<"21,="< } elseif(s=='+'){//判断+ cout<<"22,"< s=getchar(); } elseif(s=='-'){//判断- cout<<"23,"< s=getchar(); } elseif(s=='*'){//判断* cout<<"24,"< s=getchar(); } elseif(s=='/'){//判断/ cout<<"25,"< s=getchar(); } elseif(s=='('){//判断( cout<<"26,"< s=getchar(); } elseif(s==')'){//判断) cout<<"27,"< s=getchar(); } elseif(s=='['){//判断[ cout<<"28,"< s=getchar(); } elseif(s==']'){//判断] cout<<"29,"< s=getchar(); } elseif(s=='{'){//判断{ cout<<"30,"< s=getchar(); } elseif(s=='}'){//判断} cout<<"31,"< s=getchar(); } elseif(s==','){//判断, cout<<"32,"< s=getchar(); } elseif(s==': '){//判断: cout<<"33,"< s=getchar(); } elseif(s==';'){//判断; cout<<"34,"< s=getchar(); } elseif(s=='>'){//判断>或>= s=getchar(); if(s=='='){ cout<<"37,>="< s=getchar(); }else{cout<<"35,>"< } elseif(s=='<'){//判断<或<= s=getchar(); if(s=='='){ cout<<"38,<="< s=getchar(); }else{cout<<"36,<"< } elseif(s=='! '){ s=getchar(); if(s=='='){ cout<<"40,! ="< s=getchar(); } } } } 试验结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验