内容简介:
一、设计目的
了解词法分析程序的基本构造原理,掌握词法分析程序的手工构造及自动构造方法。
二、设计内容
根据PASCAL语言的说明语句形式,用手工及自动方法构造一个对说明语句进行词法分析的程序。该程序能对从键盘输入或从文件读入的形如:
“const count=10,sum=81.5,char1=’f’,string1=”hj”, max=169;”
的常量说明串进行处理,分析常量说明串中各常量名、常量类型及常量值,并统计各种类型常量个数。
三、设计要求
1、输入的常量说明串,要求最后以分号作结束标志;
2、根据输入串或读入的文本文件中第一个单词是否为“const”判断输入串或文本文件是否为常量说明内容;
3、识别输入串或打开的文本文件中的常量名。常量名必须是标识符,定义为字母开头,后跟若干个字母,数字或下划线;
4、根据各常量名紧跟等号“=”后面的内容判断常量的类型。其中:字符型常量定义为放在单引号内的一个字符;字符串常量定义为放在双引号内所有内容;整型常量定义为带或不带+、- 号,不以0开头的若干数字的组合;实型常量定义为带或不带+、- 号,不以0开头的若干数字加上小数点再后跟若干数字的组合;
5、统计并输出串或文件中包含的各种类型的常量个数;
6、以二元组(类型,值)的形式输出各常量的类型和值;
7、根据常量说明串置于高级语言源程序中时可能出现的错误情况,模仿高级语言编译器对不同错误情况做出相应处理。
四、运行结果
1、输入如下正确的常量说明串:
const count=10,sum=81.5,char1=‘f’,max=169,str1=“h*54 2..4S!AAsj”, char2=‘@’,str2=“aa!+h”;
输出:
count(integer,10)
sum(float,81.5)
char1(char, ‘f’)
max(integer,169)
str1(string,“h*54 2..4S!AAsj”)
char2(char, ‘@’)
str2(string,“aa!+h”)
int_num=2; char_num=2; string_num=2; float_num=1.
2、输入类似如下的保留字const错误的常量说明串:
Aconstt count=10,sum=81.5,char1=‘f’;
输出类似下面的错误提示信息:
It is not a constant declaration
Please input a string again!
3、输入类似如下含常量名或常量值错误的常量说明串:
const count=10,12sum=81.5,char1=‘ff’,max=0016;
输出类似下面的错误提示信息:
count(integer,10)
12sum(Wrong! It is not a identifier!)
char1(Wrong! There are more than one char in ‘’.)
max(Wrong! The integer can’t be started with ‘0’.)
int_num=1; char_num=0; string_num=0; float_num=0.
4、其他类型的错误处理情况(略)。
五、提示
本课程设计重点有三个:一是作为常量名的标识符的识别;二是如何根据“=”后出现的内容来判断常量类型;三是对各种错误的处理。难点是对整型和实型常量的判断必须综合考虑多种可能情况。
提示:
用指针或数组与指针相结合来处理输入的常量说明串;
对整型和实型常量处理时,重点考虑常数中‘0’的位置。
六、分析与讨论
1、若考虑用E或e的科学计数法来表示整数和实数,应该如何实现?
2、若考虑布尔型常量,且规定其值只能为true或false,应该如何实现?
3、如何对手工构造的词法分析程序做进一步的优化,以提高代码质量和运行效率?
说明语句的词法分析器
【设计目的】
了解词法分析程序的基本构造原理,掌握词法分析程序的手工构造及自动构造方法。
【设计内容】
根据PASCAL语言的说明语句形式,用手工及自动方法构造一个对说明语句进行词法分析的程序。该程序能对从键盘输入或从文件读入的形如:
“const count=10,sum=81.5,char1=’f’,string1=”hj”, max=169;”
的常量说明串进行处理,分析常量说明串中各常量名、常量类型及常量值,并统计各种类型常量个数。
【设计要求】
1、输入的常量说明串,要求最后以分号作结束标志;
2、根据输入串或读入的文本文件中第一个单词是否为“const”判断输入串或文本文件是否为常量说明内容;
3、识别输入串或打开的文本文件中的常量名。常量名必须是标识符,定义为字母开头,后跟若干个字母,数字或下划线;
4、根据各常量名紧跟等号“=”后面的内容判断常量的类型。其中:字符型常量定义为放在单引号内的一个字符;字符串常量定义为放在双引号内所有内容;整型常量定义为带或不带+、- 号,不以0开头的若干数字的组合;实型常量定义为带或不带+、- 号,不以0开头的若干数字加上小数点再后跟若干数字的组合;
5、统计并输出串或文件中包含的各种类型的常量个数;
6、以二元组(类型,值)的形式输出各常量的类型和值;
7、根据常量说明串置于高级语言源程序中时可能出现的错误情况,模仿高级语言编译器对不同错误情况做出相应处理。
【算法思想】
本题是对PASCAL语言的说明语句的识别,PASCAL语言的说明语句形式由以下部分构成:
Const 变量名=变量值,变量名=变量值,……;
。。。。。。。。
【变量与函数说明】
1、变量定义:
char lexbuf[BUFSIZE]; //变量名数组
char token[BUFSIZE]; //变量值数组
int int_num=0,char_num=0, string_num=0, float_num=0; //不同类型的变量计数
2、函数声明:
void error(char *lexbuf,char *token):
对每组变量名和变量值进行错误检查,若无错误,则输出三元组结果;
。。。。。。。
【实验源代码】
/******************词法分析程序lex.c*******************/
#include ﹤stdio.h﹥
#include ﹤string.h﹥
#include ﹤ctype.h﹥
#define BUFSIZE 20 /* 定义缓冲区大小*/
char lexbuf[BUFSIZE]; //变量名数组
char token[BUFSIZE]; //变量值数组
int int_num=0,char_num=0, string_num=0, float_num=0; //不同类型的变量计数
/********对每组变量名和变量值进行错误检查,若无错误,则输出三元组结果**********/
void error(char *lexbuf,char *token)
。。。。。。。
【运行结果】
相关说明:
1. 如您下载的资料不止一份,建议您注册成为本站会员。会员请登录后下载。
2. 会员购买金币50元以下,0.7元/个,50元以上,0.5元/个。具体请看:下载与付款。
3. 会员48小时内下载同一文件,不重复扣金币。
4. 下载后请用WinRAR或WinZIP解压缩后使用。
5. 如仍有其他下载问题,请看常见问题解答。
下载地址: