词法分析器设计.docx
- 文档编号:27558833
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:14
- 大小:160.66KB
词法分析器设计.docx
《词法分析器设计.docx》由会员分享,可在线阅读,更多相关《词法分析器设计.docx(14页珍藏版)》请在冰豆网上搜索。
词法分析器设计
词法分析器设计
1、实验目的
1、为初等函数运算语言构造语法分析器。
2、掌握生成词法分析器的方法,加深对词法分析原理的理解。
3、掌握设计、编制并调试词法分析程序的思想和方法。
2、实验内容
2.1词法模式设计/正则式
1、初等函数运算语言的常量为实数类型,其定义方式为实数的最一般书写方式,如:
123.321。
具体要求:
不支持整数部分大于0时首数字为0;不支持小数点后结尾为0;不支持科学记数法;不支持仅为整数时有小数点。
^[1-9][0-9]*(.[0-9]*[1-9]+)?
$
2、初等函数运算语言的变量采用与C语言的标识符定义一样的方式:
首字符为字母或下划线;其他的为字母、数字及下划线的混合串;区分大小写;变量长度不超过32个字符。
^[a-zA-Z_][A-Za-z0-9]{0,31}$
3、初等函数运算语言需要处理的函数仅为表一中所列举的内容。
4、初等函数运算语言支持四则运算,其计算的符号与C语言相同,为:
+-*/。
^[+-*/]$
5、初等函数运算语言的合法的分隔符包括:
空格、制表符、、分行符圆括号(左、右)、分号。
其中空格、制表符、分行符可以出现在任何两个不同的单词中间;圆括号(左、右)用于表达式中,用于改变运算的优先级,以及标识函数的参数;分号用于标识一个语句的结束。
^[\f\t\n();]$
6、初等函数运算语言支持的常量还包括:
PI,E。
^PI|E$
2.2DFA
2.3状态转换表
_
字符
数字
运算符
小数点
0
0
1
2、4
0
1
0
1
1
0
2
0
0
3
3
0
0
3
0
4
0
0
4
0
3
2.4记号表
2、实验程序清单
function.cpp
mains.cpp
name.h
wordID.txt
3、调试过程和运行结果
4、"x=0.5*PI;y=E;?
1/3*(ln(y)+5*sin(x))+(7+z)^2;"
5、程序的主要部分及其功能说明
函数声明
----------------------------------------name.h------------------------------------------------------
#include
#include
usingnamespacestd;
constintMax=1000;
conststringFunctionName[]={"sin","cos","tg","ctg","log","lg","ln","PI","E"};//关键字
classOperate
{
private:
stringstr;//输入的字符串
stringword[Max];//输出的结果
intnum[Max];//输出的类型
public:
intstartPostion;//字符开始位置
intnowPostion;//字符当前位置
intlength;//结果个数
Operate(strings);
voidgetWordAndNum();
boolisNumber(charc);
boolisChar(charc);
//boolisChar(charc);
intisOperaters(charc);
boolisblank(charc);
voidaddWords(strings,intn);
};
intisKey(stringstr);
voidwork(stringstr);
-----------------------------------------function.cpp------------------------------------------------
函数定义
-----------------------------------------function.cpp------------------------------------------------
#include
#include
#include
#include"name.h"
usingnamespacestd;
//Operate类定义
Operate:
:
Operate(strings)
{
str=s;
startPostion=0;
nowPostion=0;
length=0;
}
voidOperate:
:
getWordAndNum()
{
for(inti=0;i<=(length-1);i++)
cout<<"<"<
}
boolOperate:
:
isNumber(charc)
{
if(c>='0'&&c<='9')
returntrue;
returnfalse;
}
boolOperate:
:
isChar(charc)
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')||c=='_')
returntrue;
returnfalse;
}
intOperate:
:
isOperaters(charc)
{
switch(c)
{
case'?
':
return10;
case';':
return11;
case'(':
return12;
case')':
return13;
case'+':
return14;
case'-':
return15;
case'*':
return16;
case'/':
return17;
case'=':
return18;
case'^':
return19;
default:
return0;
};
}
boolOperate:
:
isblank(charc)
{
switch(c)
{
case'':
case'\t':
case'\n':
returntrue;
}
returnfalse;
}
voidOperate:
:
addWords(strings,intn)
{
word[length]=s;
num[length]=n;
length+=1;
}
//其他函数
//是否是关键字,是返回序号,否返回0
intisKey(stringstr)
{
for(inti=0;i<9;i++)
if(str==FunctionName[i])
returni+1;
return0;
}
voidwork(stringstr)
{
intlongs=str.length();
stringaword;
charc;//当前字符
intstate=0;//状态
intnumber=0;//类型
Operateop(str);
while(true)
{
//读取字符
if(op.nowPostion>=longs)
break;
else
c=str[op.nowPostion];
switch(state)
{
case0:
//初始状态
if(c=='$')
break;
//如果是运算符
//保存当前运算符,startPostion=nowPostion=+1
number=op.isOperaters(c);
if(number>0)
{
op.addWords(str.substr(op.startPostion,1),number);
op.nowPostion++;
op.startPostion=op.nowPostion;
break;
}
if(op.isblank(c))
{
op.nowPostion++;
op.startPostion=op.nowPostion;
break;
}
//如果是字符
if(op.isChar(c))
{
state=1;
op.nowPostion++;
break;
}
if(c>='1'&&c<='9')
{
state=4;
op.nowPostion++;
break;
}
if(c='0')
{
state=2;
op.nowPostion++;
break;
}
break;
case1:
//识别字符串
if(op.isChar(c)||op.isNumber(c))
{
op.nowPostion++;
break;
}
//否则的话,完成当前标识符的识别
number=20;
aword=str.substr(op.startPostion,op.nowPostion-op.startPostion);
if(isKey(aword)>0)
number=isKey(aword);
op.addWords(aword,number);
op.startPostion=op.nowPostion;
state=0;
break;
case2:
//识别0,若下一个字符不是小数点'.'则显示输入错误,跳过0,读取下一个字符
if(c=='.')
{
state=3;
op.nowPostion++;
break;
}
if(op.isOperaters(c)>0)
{
state=0;
break;
}
op.addWords("0开头,输入错误!
跳过",0);
op.startPostion=op.nowPostion;
state=0;
break;
case3:
//识别0-9
if(op.isNumber(c))
{
op.nowPostion++;
break;
}
op.addWords(str.substr(op.startPostion,op.nowPostion-op.startPostion),21);
op.startPostion=op.nowPostion;
state=0;
break;
case4:
//识别1-9
if(op.isNumber(c))//识别整数
{
op.nowPostion++;
break;
}
if(c=='.')//识别小数
{
state=3;
op.nowPostion++;
break;
}
op.addWords(str.substr(op.startPostion,op.nowPostion-op.startPostion),21);
op.startPostion=op.nowPostion;
state=0;
break;
}
}
op.getWordAndNum();
}
------------------------------------------mains.cpp------------------------------------------
主函数
输入测试数据!
------------------------------------------mains.cpp------------------------------------------
#include
#include
#include"name.h"
usingnamespacestd;
voidmain(void)
{
//测试数据
stringstr="x=0.5*PI;y=E;?
1/3*(ln(y)+5*sin(x))+(7+z)^2;";
work(str);
system("pause");
}
6、实验收获体会
通过这次试验初步掌握生成词法分析器的方法,加深对词法分析原理的理解。
7、改进意见
用函数指针来调用判断字符类型,以便于以后更改关键字等判断条件时,大量修改代码。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析器 设计