- 1、本文档共48页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2017届课程设计
?
?
扫描器设计
?
姓 名:?库尔班江.阿瓦克日
学??号:??5011212524??
学 院:? 信息工程学院??
专??业:?计算机科学与技术
班??级:? 计算机17-1班?
?
?
塔里木大学教务处制
实验一 词法扫描器设计
一 实验目的
通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。id( Letter temp
int10( Num int10 | Num
OP( +| - |* |/ || | = | ( | ) | ; | ‘ | == | = |= | !=
Keyword(if | then | else | while | do
Letter(a|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z
Num(0|1|2|3|4|5|6|7|8|9 |ε
temp( Letter temp | Num temp |ε
一.设计内容1.根据附录给定的文法,从输入的类C语言源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分隔符五大类;文法见最后附录。
2.源程序保存在文件中。
3.词法分析后可查看符号表和TOKEN串表;
4.保存符号表和TOKEN串表(如:文本文件);
二
1.首先根据题目要求对要进行词法分析的单词符号进行编码。
单词符号 种别编码 单词符号 种别编码 main 1 [ 17 int 2 ] 18 char 3 { 19 if 4 } 20 else 5 , 21 for 6 : 22 while 7 ; 23 ID 8 > 24 NUM 9 < 25 = 10 >= 26 + 11 <= 27 - 12 == 28 * 13 != 29 / 14 ( 15 ) 16 2.在本实验中,将需要出来的文法符号分为几类:
(1)关键字在本实验中对关键字分别进行存储在判断是否为标识符前首先对关键字进行识别
(2)标识符:标识符处理函数识别标识符。
正则定义为
(3)运算符:运算符包括
= + - * / ( ) [ ] { } , ; = = == != 等需单独写函数进行识别
关系运算符需根据下图进行识别:
(4)数字:在本例中仅识别整数。
digit = 1|2|3|4|5|6|7|8|9
Digit = 0|1|2|3|4|5|6|7|8|9
Digit = digit Digit*
3.扫描器
三
1.数据结构
dulClass存储划分好的词法单元的分类存储有单元的名称和单元的标号与上面的表格中的信息一致
在程序开始时需要首先将分类信息读取然后填充表格
class ModulClass //存储词法单元的分类
{
public:
string strID; //单元名字
int number; //单元编号
};
ModulClass modulclass[ModulClass_size];
(2)Codeclass存储在程序识别过程中识别到的词法单元
class CodeClass //存储识别过程中识别的词法单元
{
public:
string code; //名字
int number; //编号
};
CodeClass codeclass[CodeClasss_size];
2.预处理模块 readcode()函数ifstream infile(code.txt,ios::in);
if (!infile)
{
cout无法打开代码文件!endl;
exit(-1);
}
infile.getline(temp,1000,EOF);
temp[strlen(temp)] = \0;
(2)去除换行符号
for(i = 0;i strlen(temp);i++)
{
if(temp[i] == \n)
strtemp += ;
else
strtemp += temp[i];
}
(3)去除多余的空格符号,将多个空格连续的压缩成一个
for(j = 0;j = strtemp.length();)
{
if(strtemp[j] == )
{
while(strtemp[++j] == )
{}
strcode += ;
文档评论(0)