编译原理词法分析课程设计Word格式文档下载.docx
- 文档编号:22571749
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:16
- 大小:396.98KB
编译原理词法分析课程设计Word格式文档下载.docx
《编译原理词法分析课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析课程设计Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
a)需求分析:
说明程序任务
●输入及其范围,输出形式,测试数据(正确,错误数据)
测试数据:
voidmain()
{
inta,b;
a=10;
b=a+20;
}
End
输出形式:
(2,”main”)(5,”(“)(5,”)“)(5,”{“)(1,”int”)(2,”a”)(5,”,”)(2,”b”)(5,”;
”)(2,”a”)(4,”=”)(3,”10”)(5,”;
”)(2,”b”)(4,”=”)(2,”a”)(4,”+”)(3,”20”)(5,”;
”)(5,”}“)
●词法分析器的功能是输入源程序,输出单词符号。
●本实验中,可采用的是一大类符号一类别码的方式。
b)概要设计
主程序流程:
否
是
模块间的调用关系:
c)详细设计
主函数:
#include<
stdio.h>
string.h>
charprog[80],token[8],ch;
intsyn,p,m,n,sum;
char*rwtab[6]={"
begin"
"
if"
then"
while"
do"
end"
};
voidscaner(void);
intmain()
p=0;
printf("
pleaseinputastring(endwith'
#'
):
\n"
);
do{
scanf("
%c"
&
ch);
prog[p++]=ch;
}while(ch!
='
scaner();
switch(syn)
{
case11:
(%-10d%5d)\n"
sum,syn);
break;
case-1:
youhaveinputawrongstring\n"
return0;
default:
(%-5d%s%s%s)\n"
syn,"
“"
token,"
”"
}
}while(syn!
=0);
Scaner()函数:
voidscaner(void)
实现对输入程序的分析;
并将分析结果返回给main()函数;
(详细源代码见电子稿)
4、运行结果及分析
输入程序:
运行结果:
时间复杂度分析:
本实验对每个字符逐一读取,以单词为单位,与原有的合法字符进行一一比对,时间复杂度为单词个数的常数倍,所以对于n个字符的源程序复杂度为n。
五、实验体会
经过这次试验,理解了词法分析的基本思想,对编译器的编译过程有了一定的了解。
最重要的是,这次课程设计,在锻炼我编程能力的同时,让我对课堂上学到的知识有了比较透彻的理解。
实验二C-语言的词法分析器(基于Lex)
一.课程设计目标
自动构造C-语言的的词法分析器,要求能够掌握编译原理的基本理论,,理解编译程序的基本结构,掌握编译各阶段的基本理论和技术,掌握编译程序设计的基本理论和步骤.,增强编写和调试高级语言源程序的能力,掌握词法分析的基本概念和实现方法,熟悉C-语言的各种Token。
二.分析与设计过程
基于ParserGenarator的词法分析器构造方法
Lex输入文件由3个部分组成:
定义集(definition),规则集(rule)和辅助程序集(auxiliaryroutine)或用户程序集(userroutine)。
这三个部分由位于新一行第一列的双百分号分开,因此,Lex输入文件的格式如下
{definitions}
%%
{rules}
{auxiliaryroutines}
而且第一部分用“%{”和“%}”括起来。
第一和第三个部分为C语言的代码和函数定义,第二个部分为一些规则。
定义正则表达式如下
ID=letterletter*
NUM=digitdigit*
Letter=a|…|z|A|…|Z
Digit=0|…|9
Keyword=else|if|int|return|void|while
Specialsymbol=+|-|*|/|<
|<
=|>
|>
=|==|!
=|=|;
|,|(|)|[|]|{|}|/*|*/
Whitespace=“”
Enter=\n
在lex中的构造
letter[A-Za-z]
digit[0-9]
id({letter}|[_])({letter}|{digit}|[_])*
error_id({digit})+({letter})+
num{digit}+
whitespace[\t]+
enter[\n]+
在Lex中的规则定义构造
定义识别保留字规则
"
int"
|"
else"
return"
void"
{Upper(yytext,yyleng);
printf("
%d行"
lineno);
%sreservedword\n"
yytext);
}//保留字
定义识别数字规则
{num}
{printf("
%sNUM\n"
}//数字
定义识别专用符号规则
;
("
)"
{"
}"
*"
/"
+"
-"
>
<
="
=="
!
/*"
*/"
%sspecialsymbol\n"
}//特殊符号
定义识别标识符规则
{id}
%sID\n"
}//标识符
定义识别错误的字符串规则
当开头为数字的后面为字母的字符串时,是错误的标识符。
{error_id}
error:
%s\n"
}//以数字开头的字符自动报错
定义忽略空格规则
{whitespace}
{/*skipwhitespace*/}//忽略空格
定义忽略回车规则
{enter}
{lineno++;
}//遇到回车自动加行号忽略
辅助程序集中包括
主函数main()和辅助函数toupper()。
三.程序代码实现
Lex代码
//定义集,包括头文件和变量定义
%{
ctype.h>
stdlib.h>
intlineno=1;
//定义行号
%}
//定义正则表达式
letter[A-Za-z]//字母
digit[0-9]//数字
id({letter}|[_])({letter}|{digit}|[_])*//开头为字母的标识符
error_id({digit})+({letter})+//开头为数字的错误标识符
num{digit}+//数字集合
whitespace[\t]+//空格
enter[\n]+//回车
//定义识别规则
//识别保留字
//打印行号
}//输出保留字
//识别数字
}//输出数字
//识别专用符号
}//输出特殊符号
//识别标识符
//打印行号
}//打印标识符
//识别错误的标识符
{printf("
%s\n"
//识别空格
//识别回车
//转换大小写
Upper(char*s,intl){
inti;
for(i=0;
i<
l;
i++){
s[i]=toupper(s[i]);
}//将保留字变为大写
//主函数
main(void)
//定义输入文件名变量
charinfilename[400];
输入文件名:
%s"
infilename);
yyin=fopen(infilename,"
r"
//读取文件
开始词法分析:
\n"
returnyylex();
4.测试结果
测试的文件代码(第一组)
测试结果分析
测试的文件代码(第二组)
测试的文件代码(第三组)
五.总结
通过这次试验,掌握了编译原理的基本理论,,理解了编译程序的基本结构,掌握了编译各阶段的基本理论和技术,虽然遇到了很多困难,但是通过自己的努力和老师同学的帮助,掌握了词法分析的基本概念和实现方法。
让我对词法分析有了进一步的了解,学会了运用Lex自动构造词法分析器,学会了基于ParserGenarator的词法分析器构造方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 课程设计