哈工大编译系统课程实验一词法分析报告

编译系统课程实验报告
实验1:词法分析
一、需求分析 得分
要求:阐述词法分析系统所要完成的功能
1.巩固对词法分析的基本功能和原理的认识。
2.能够应用自动机的知识进行词法分析。
3. 理解并处理词法分析中的异常和错误。
能识别用户输入以下几类单词:
a.标识符(由大小写字母、数字以及下划线组成,但必须以字母或者下划线开头)
b.关键字(①类型关键字:整型、浮点型、布尔型、记录型;②分支结构中的if和else;③循环结构中的do和while;④过程声明和调用中的关键字)
c.运算符(①算术运算符;②关系运算符;③逻辑运算)
d.界符(①用于赋值语句的界符,如“=”;②用于句子结尾的界符,如“;”;③用于数组表示的界符,如“[”和“]”;④用于浮点数表示的界符“.”)
e.常数(无符号整数(含八进制和十六进制数)、浮点数(含科学计数法)、字符串常数等)
f.注释。识别两种风格的注释:一种是使用双斜线“∥”进行单行注释,在这种情况下,该行在“//”符号之后的所有字符都将作为注释内容而直接被词法分析程序丢弃掉;另一种是使用“/”以及“/”进行多行注释,在这种情况下,在“/”与之后最先遇到的“/”之间的所有字符都被视作注释内容而直接被词法分析程序丢弃掉。
(2)能够进行简单的错误处理,即识别出测试用例中的非法字符。程序在输出错误提示信息时,需要输出具体的错误类型(即词法错误)、出错的位置(源程序行号)以及相关的说明文字,其格式为:Lexical error at Line [行号]: [说明文字].
说明文字的内容没有具体要求(例如:非法字符),但是错误类型和出错的行号一定要正确,因为这是判断输出错误提示信息是否正确的唯一标准。
(3)系统的输入形式:要求能够通过文件导入测试用例。测试用例要涵盖“实验内容”中列出的各类单词。
(4)系统的输出形式:打印输出测试用例对应的token序列
二、文法设计 得分
要求:对如下内容展开描述
(1)给出各类单词的词法规则描述(正则文法或正则表达式)
1.标识符:{letter}({letter}|{digit})* {printf("%s <IDN,%s>\n",yytext,yytext);}
2.关键字:“int” {printf("%s <TYPE,>\n",yytext);}
“float” {printf("%s <TYPE,
>\n",yytext);}
“boolean” {printf("%s <TYPE,>\n",yytext);}
“struct” {printf("%s <STRUCT,
>\n",yytext);}
“return” {printf("%s <RETURN,>\n",yytext);}
“if” {printf("%s <IF,
>\n",yytext);}
“else” {printf("%s <ELSE,>\n",yytext);}
“while” {printf("%s <WHILE,
>\n",yytext);}
“do” {printf("%s <DO,>\n",yytext);}
3.运算符:"+" {printf("%s <PLUS,
>\n",yytext);}
“-” {printf("%s <MINUS,>\n",yytext);}
“*” {printf("%s <STAR,
>\n",yytext);}
“/” {printf("%s <DIV,>\n",yytext);}
“&&” {printf("%s <AND,
>\n",yytext);}
“||” {printf("%s <OR,_>\n",yytext);}

|<|>=|<=|==|!= {printf("%s <RELOP,>\n",yytext);}
“++” {printf("%s <INC,
>\n",yytext);}
4.界符:";" {printf("%s <SEMI,>\n",yytext);}
“,” {printf("%s <COMMA,
>\n",yytext);}
“=” {printf("%s <ASSIGNOP,>\n",yytext);}
5.常数:[±]?[1-9]{digit}|0 {printf("%d <CONST,%d>\n",atoi(yytext),atoi(yytext));}
0[0-7]
{printf("%s <OCT,
>\n",yytext);}
0x[1-9|a-fA-F][0-9|a-fA-F]* {printf("%s <HEX,>\n",yytext);}
[±]?({digit}+.{digit}+)|[±]?({digit}+.{digit}+)[Ee][±]?{digit}+|[±]?({digit})[Ee][±]?{digit}+
{printf("%s <FLOAT,%s>\n",yytext,yytext);}
6.注释:"//"(.)|"/"*[^/]**"/" {printf(" <COMMENT,
>\n");}
7.字符串:".*?[^\]"|""{printf(" <STRING,_>\n");}
(2)各类单词的转换图
1.标识符
在这里插入图片描述

2.关键字
在这里插入图片描述

3.运算符
在这里插入图片描述

4.界符
在这里插入图片描述

5.常数(此处用正数为例)
在这里插入图片描述

6.注释
//形
在这里插入图片描述

/**/形
在这里插入图片描述

7字符串
在这里插入图片描述

三、系统设计 得分
要求:分为系统概要设计和系统详细设计。
(1)系统概要设计:给出必要的系统宏观层面设计图,如系统框架图、数据流图、功能模块图等以及相应的文字说明。
在这里插入图片描述

(2)系统详细设计:对如下工作进行展开描述
核心数据结构的设计‘
利用flex功能将用户输入对比正则表达式进行比对。
主要功能函数说明
在这里插入图片描述

该main函数通过命令行读入若干个参数,取第一个输入作为文件名并尝试打开该文件,如果成功就调用yylex()函数进行词法分析,其中yyin是Flex内部的一个变量,表示输入的文件指针
程序核心部分的程序流程图
在这里插入图片描述

四、系统实现及结果分析 得分
要求:对如下内容展开描述。
(1)系统实现过程中遇到的问题;
(2)针对某测试程序输出其词法分析结果;
(3)输出针对此测试程序对应的词法错误报告;
(4)对实验结果进行分析。
注:其中的测试样例自行产生。
测试用例:
在这里插入图片描述

测试结果:
在这里插入图片描述

在这里插入图片描述

错误报告:输入字符不符合词法分析器中的条件就会报错。
分析结果:当读取到非关键字的字符输入时能正确识别标识符。
当读取到int,float,boolen,struct,else,if,do,while,return等关键字时能够正确识别关键字。
当读取到0[0-9]开头的数据能正确识别为8进制数,0x开头正确识别16进制数,[±]?[1-9][0-9]*|0能够正确识别整数,[±]?([0-9]+.[0-9]+)能够正确识别为float型数,|[±]?([0-9]+.[0-9]+)[Ee][±]?[0-9]+|[±]?([0-9])[Ee][±]?[0-9]+ 能够正确识别为科学计数法。

|<|>=|<=|==|!=,+,*,-,/,&&,||,++能够正确识别为运算符。,.;能够正确识别为界符。
//,/**/能够正确将中间的部分注释掉。””能够发现是字符串内容

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值