实验 1 词法分析程序的设计
一、实验目的
掌握计算机语言的词法分析程序的开发方法。
二、实验内容
编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。
三、实验要求
1、根据以下的正规式,编制正规文法,画出状态图;
标识符
十进制整数
<字母>(<字母>|<数字字符>)*
0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*
如有余力,则进一步分析八进制和十六进制整数,其正规式如下:
八进制整数
十六进制整数
0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*
+ - *
main
<=
else while
(可根据需要添加)
) ; {
then
if
运算符和界符
(
int
2、根据状态图,设计词法分析函数 int scan( ),完成以下功能:
/ > < =
>=
do
关键字
}
1) 从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,
2) 以二元式形式输出单词<单词种类,单词属性>
其中单词种类用整数表示:
0:标识符
1:十进制整数
2:八进制整数
3:十六进制整数
运算符和界符,关键字采用一字一符,不编码
其中单词属性表示如下:
标识符,整数由于采用一类一符,属性用单词表示
运算符和界符,关键字采用一字一符,属性为空
3、编写测试程序,反复调用函数 scan( ),输出单词种别和属性。
四、实验环境
PC 微机
DOS 操作系统或 Windows 操作系统
Turbo C 程序集成环境或 Visual C++ 程序集成环境
五、实验步骤
1、 根据正规式,画出状态转换图;
2、 根据状态图,设计词法分析算法;
3、 采用 C 或 C++语言,设计函数 scan( ),实现该算法;
4、 编制测试程序(主函数 main);
5、调试程序:读入文本文件 program.txt,运行程序得到输出结果 result.txt,并检查输
出结果是否正确。
六、测试数据
输入数据:
编辑一个文本文件 program.txt,在文件中输入一段程序代码,如:
if data+92>0x3f
then
data=data+01;
else
data=data-01;
将输出结果存放在 result.txt 文件中,输出格式如下:
<0 , data>
<+ , ->
<1 , 92>
<> , ->
<3 , 3f>
<0 , data>
<= , ->
<0 , data>
<+ , ->
<2 , 1>
<; ,->
<0 , data>
<= , ->
<0 , data>
<- , ->
<2 , ->
<; , ->
七、实验报告要求
实验报告应包括以下几个部分:
1、词法的正规式描述;
2、变换后的状态图;
3、词法分析程序的数据结构与算法。
【源程序】
#include
#include
using namespace std;
#define LENGTH 5
char ch =' ';
string key[5]={"if","then","else","while","do"};
int Iskey(string c){
//关键字判断
int i;
for(i=0;i='a'))||((c<='Z')&&(c>='A'))) return 1;
else return 0;
}
int IsLetter1(char c) {
//判断是否为 a~f 字母
if(((c<='f')&&(c>='a'))||((c<='F')&&(c>='A'))) return 1;
else return 0;
}
int IsNum(char c){
//判断是否为数字
if(c>='0'&&c<='9') return 1;
else return 0;
}
void scan(FILE *fpin){
string arr="";
while((ch=fgetc(fpin))!=EOF)
{
arr="";
if(ch==' '||ch=='\t'||ch=='\n'){}
else if(IsLetter(ch)||ch=='_')
{
arr=arr+ch;
ch=fgetc(fpin);
while(IsLetter(ch)||IsNum(ch))
{
}
if((ch<='Z')&&(ch>='A')) ch=ch+32;
arr=arr+ch;
ch=fgetc(fpin);
fseek(fpin,-1L,SEEK_CUR);
if (Iskey(arr)){cout<<"<"<
"<"<='0'&&ch<='7'){
while(ch>='0'&&ch<='7')
{
flag=1;
arr=arr+ch;
ch=fgetc(fpin);
}
}
else if(ch=='x'||ch=='X')
{
flag=2;
arr=arr+ch;
ch=fgetc(fpin);
while(IsNum(ch)||IsLetter1(ch))
{
arr=arr+ch;
ch=fgetc(fpin);
}
}
else if(ch==' '||ch==','||ch==';' ){
cout<<"<"<"<"<"<else
{
arr=arr+ch;
ch=fgetc(fpin);
while(IsNum(ch))
{
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
cout<<"<"<
"<"<"<"<"<' :{ch=fgetc(fpin);
if(ch=='=') cout<<"<"<<">="<<",运算符>"<')cout<<"<"<<">>"<<",输入控制符>"<"<<",运算符>"<case'<' :{ch=fgetc(fpin);
if(ch=='=')cout<<"<"<<"<="<<",运算符>"<"<') cout<<"<"<<"<>"<<",运算符>"<"<"<>in_fn;
if((fpin=fopen(in_fn,"r"))!=NULL) break;
else cout<<"文件路径错误!请输入文件路径及文件名:";
}
scan(fpin);
system("pause");
fclose(fpin);
}
3、 实验总结与体会
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析
原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用 C++直接编写此法
分析程序。另外,也让我重新熟悉了 C++语言的相关内容,加深了对 C++语言的用途的
理解。