目录
一、需求分析(三 ,宋体,粗体) 2
二、系统设计(三 ,宋体,粗体) 4
(一)系统中的数据定义(四 ,黑体,粗体) 4
(二)系统的概要设计 4
(三)系统的详细设计 8
(四)系统的核心算法 9
三、系统编码及运行(三 ,宋体,粗体) 11
(一)系统开发涉及的软件 11
(二)系统运行界面及结果 11
四、系统测试(三 ,宋体,粗体) 13
五、总结 16
附录(源代码) 20
(注:这部分可以点击右键更新生成,重新设置字体为四 )
- 需求分析
当今时代是飞速发展的信息时代,随着计算机技术的普及与 络的广泛应用,计算机语言更显得至关重要。计算机语言是人与计算机之间传递信息的媒介。计算机系统最大特征是指令通过一种语言传达给机器。为了使电子计算机进行各种工作,就需要有一套用以编写计算机程序的数字、字符和语法规划,由这些字符和语法规则组成计算机各种指令(或各种语句)。这些就是计算机能接受的语言。一个高级语言程序的实现,必须依赖于相应的编译系统。编译程序的基本任务是将源语言程序翻译成等价的目标语言程序。
词法分析阶段是编译过程的第一个阶段,是编译的基础。词法分析结果的好坏将直接影响中文信息处理上层应用的效果。理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实现方法和技术,加深对编译原理的理解,掌握编译程序的实现方法和技术至关重要。
本次项目则为简单的词法分析器,通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。具体方法为:编制一个读单词的程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符和分隔符五大类。并依次输出各个单词的内部编码及单词符 自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。
词法分析器相关知识:
1.词法分析器的功能和输出格式
词法分析器的功能是输入源程序,输出单词符 。词法分析器的单词符 常常表示成以下的二元式(单词种别码,单词符 的属性值)。在本实验中,采用的是一类符 一种别码的方式。
标识符的BNF表示:
<标识符>-> <字母><字母数字串>
<字母数字串>-><字母><字母数字串>|<数字><字母数字串>|ε
无符 整数的BNF表示:
<无符 整数>-> <数字><数字串>
<数字串>-> <数字><数字串> |ε
运算符的BNF表示:
<加法运算符>-> +
<减法运算符>-> –
<大于关系运算符>-> >
<大于等于关系运算符>-> >=
2.超前搜索
词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a>i”,当前字符为’>’,此时,分析器到底是将其分析为大于关系运算符还是大于等于关系运算符呢然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符’+’,这时可知应将’>’解释为大于运算符。但此时,超前读了一个字符’i’,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符 整数等时也有类似情况。
简单流程如图1.1
图1.1程序简单流程图
二、系统设计(三 ,宋体,粗体)
(一)系统中的数据定义(四 ,黑体,粗体)
定义:词法分析器的功能输入源程序,按照构词规则分解成一系列单词符 。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常数等。
- 识别保留字:if、int、for、while、do、return、break、continue等
- 运算符包括:+、-、*、/、=、>、<、>=、<=、!=
- 分隔符包括:,、;、{、}、(、)
- 常数为无符 整形数;
- 其它的都识别为标识符;
输出:词法分析器所输出单词符 常常表示成如下的二元式:(单词,单词符 的属性值)
标识符一般统归为一种。常数包括整数和浮点数两种。
关键字、运算符、界符可将其全体视为一种。
单词符 的属性是指单词符 的特性或特征。
- 系统的概要设计
功能流程图如图:
实现词法分析的函数为
/**词法分析**/
void analyse(FILE * fpin){
char ch=’ ‘;
string arr=””;
while((ch=fgetc(fpin))!=EOF){
arr=””;
if(IsFilter(ch)){} //判断是否为过滤符
else if(IsLowLetter(ch)){ //判断是否为关键字
while(IsLowLetter(ch)){
arr += ch;
ch=fgetc(fpin);
}
//fseek(fpin,-1L,SEEK_CUR);
if(IsKeyword(arr)){
cout<<arr<<” <关键字>”<<endl;
}
else
{
cout<<arr<<” <标识符>”<<endl;
}
}
else if(IsDigit(ch)){ //判断是否为数字
while(IsDigit(ch)||(ch==’.’&&IsDigit(fgetc(fpin)))){
arr += ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
cout<<arr<<” <无符 整形数>”<<endl;
}
else if(IsUpLetter(ch)||IsLowLetter(ch)||ch==’_’){
while(IsUpLetter(ch)||IsLowLetter(ch)||ch==’_’||IsDigit(ch)){
arr += ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
cout<<arr<<” <标识符>”<<endl;
}
else switch(ch){
case ‘+’:
case ‘-‘:
case ‘*’:
case ‘/’:
case ‘>’:
case ‘<‘:
case ‘=’:
case ‘!’:
{
arr += ch;
cout<<arr<<” <运算符>”<<endl;
break;
}
case ‘;’:
case ‘,’:
case ‘(‘:
case ‘)’:
case ‘[‘:
case ‘]’:
case ‘{‘:
case ‘}’:
{
arr += ch;
cout<<arr<<” <分隔符>”<<endl;
break;
}
default :cout<<“””<<ch<<“”””:无法识别的字符!””<<endl;
}
}
}
- 系统的详细设计
1.词法分析程序打开源文件,读取文件内容,直至遇上’$’文件结束符,然后读取结束。
2.对读取的文件进行预处理,从头到尾进行扫描,去除//和/* */的内容,以及一些无用的、影响程序执行的符 如换行符、回车符、制表符等。但是千万注意不要在这个时候去除空格,因为空格在词法分析中有用,比如说int i=3;这个语句,如果去除空格就变成了“inti=3”
(二)系统运行界面及结果
(一):系统开始界面(如图1)
图1 系统登录界面
(二)系统开始运行界面
第一步:输入源文件名(包含路径和后缀)(如图2)
图2 系统输入源文件界面
(三)运行结果显示界面(如图3)
图3 系统运行结果显示界面
四、系统测试(三 ,宋体,粗体)
系统测试数据1:C:Users24125Desktopa.txt
main()
{
int a
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!