基于C++实现的自动化工具及词法语法分析程序

325 阅读3分钟

1 实验目的

  • 了解词法分析过程的基本思想
  • 体会词法分析器及其自动化生成工具的开发过程
  • 了解语法分析过程的基本思想
  • 体会语法分析器及其自动化生成工具的开发过程

2 实验内容及要求

2.1 自动生成工具要求

  • 能够根据文法自动生成词法分析程序
  • 能够根据文法自动生成语法分析程序

2.2 词法分析器设计要求

  • 输入正规文法或者正规式,经过NFA到DFA的转换,DFA最小化,递归下降法生成程序等步骤,输出能识别文法表示的句子词法分析程序
  • 要求至少支持科学计数法常量和标识符识别
  • 根据输入字符串输出Token串,如果是非法字符串则输出错误信息。

2.3 语法分析器设计要求

  • 要求使用LL(1)方法,算符优先分析方法,LR(1)三种方法之一设计语法分析程序
  • 输入上下文无关文法,输出能进行语法分析的程序
  • 输入待检测的Token串,输出检测结果和出错信息

3 实验步骤

3.1 设计词法自动生成工具myLex

3.1.1 输入输出说明

输入

VN1 VT2 VN3
VN4 VT5 VN6
.....
第一个VN为开始符号
如S->bA 则为 S b A
如S->a 则为 S a NULL
如S->NULL 则为 S NULL NULL
最多为26个状态

输出

点击G_to_NFA.exe ,NFA_to_DFA.exe ,Min_DFA.exe,得到代码文件test.cpp

3.1.2 程序流程图

myLex程序流程图如图1所示:

3.1.3 程序文件截图

myLex程序文件截图如图2所示:

3.2 设计语法自动生成工具myYacc

3.2.1 实现原理

  • 读入文法进行标记1,2,3,4......(如何记录每一项用字符串解决)
  • 写First函数
  • 写First_str() 入口参数是字符串
  • 保存项目集,并编写CLOSURE(I)函数
  • GO(I, X)函数,检测集合是否出现过,并生成图 (字符串比较)
  • 设计分析表的数据结构 (矩阵,负的为ri,正的为Si,acc=140406为接受态)
  • 根据对应的图,遍历节点,填写相应的表(结合在Go函数中)
  • 写分析的流程,根据分析表分析,返回是否正确
  • 自动生成代码:总结自己写的过程,找出变得和不变的,用代码实现

3.2.2 输入输出说明

输入

g.txt中输入拓广文法(Z代替S',$表示空)
例如 S->aABd的话记为SaABd
ZS
BaB
SBB
Bb

输出

点击myYacc,输出代码文件test2.cpp

3.3 程序流程图

myYacc程序流程图如图3所示:

3.4 程序文件截图

myYacc程序文件截图如图4所示:

3.5 设计词法分析程序

3.5.1 实现原理

在词法分析中,利用空格,tab键,换行,运算符进行分隔,获得字符串,对于简单的字符串可以在主程序中处理,对于复杂的字符串,可以将字符串用myLex自动生成的代码进行检测。

3.5.2 输入输出说明

输入

字符序列string字符串

输出

输出格式:二元式序列(类型,值)

程序流程图

词法分析程序流程图如图5所示:

程序文件截图

词法分析程序文件截图如图6所示:

3.6 设计语法分析程序

3.6.1 实现原理

在语法分析中,利用空分号进行分隔,获得处理的token串,然后根据文法将每个token串换处成文法能处理的字符串,用myYacc自动生成的代码进行检测。

3.6.2 输入输出说明

输入

token 串

输出

yes 或 error,错误情况将输出token串中出错的位置。

程序流程图

语法分析程序流程图如图7所示:

程序文件截图

语法分析程序文件截图如图8所示:

4 实验结果

4.1 词法自动生成工具myLex测试

4.1.1 科学计数法

输入文法

S d A
S . B
S e C
A d A 
A . B
A e C
A NULL NULL
B d D
D e C
D d D
D NULL NULL
C d E
C s F
F d E
E d E
E NULL NULL

依次点击演示1自动生成工具\myLex\tool中的G_to_NFA.exe ,NFA_to_DFA.exe ,Min_DFA.exe,得到代码文件test.cpp。将其中的str[index]==’d’替换成str[index]>='0' && str[index]<='9',将其中的str[index]==’s’替换成str[index]=='+'||str[index]=='-',编译得到可执行程序。

在in.txt中输入:

3.14e10
3.14e+10
3.14e-10
314e+10
314+10
.14e12
e10

程序输出

4.1.2 标识符

输入文法

S l NULL
S l A
A l NULL
A d NULL
A l A
A d A

依次点击演示1自动生成工具\myLex\tool中的G_to_NFA.exe ,NFA_to_DFA.exe ,Min_DFA.exe,得到代码文件test.cpp。将其中的str[index]==’d’替换成str[index]>='0' && str[index]<='9',将其中的str[index]==’l’替换成str[index]>='a' && str[index]<='z',编译得到可执行程序。

在in.txt中输入

abc
a12sd
123
1ab
as+
as2

程序输出

4.2 语法自动生成工具myYacc测试

4.2.1 四则运算

输入文法

ZE
EE+T
ET
TT*F
TF
F(E)
Fi

点击演示1自动生成工具\myYacc\tool中的myYacc.exe ,得到代码文件test2.cpp,编译得到可执行程序。

在in.txt中输入

i+i
i+(i*i)
i+i*)(i
i*i+(i*(i+i))

程序输出

4.2.2 书P135文法

输入文法

ZE
EaA
EbB
AcA
Ad
BcB
Bd

点击演示1自动生成工具\myYacc\tool中的myYacc.exe ,得到代码文件test2.cpp,编译得到可执行程序。

在in.txt中输入

bccd
bcd
bdc

程序输出

4.2.3 书P165文法

输入文法

ZA
AaAd
AaAb
A$

点击演示1自动生成工具\myYacc\tool中的myYacc.exe ,得到代码文件test2.cpp,编译得到可执行程序。

在in.txt中输入

ab
abaab
aba

程序输出

4.3 词法分析程序测试

4.3.1 测试代码

/*
	以下是测试程序
*/
int main(){
	int x1,x2,x3;	//变量声明
	int y=0;    	/*变量声明 并且赋值*/
	double xyz=3.14e+5;
	y=4+x1-(1-x2+y)/3*y; /*算数表达式*/ 
	if(y>=0){ /*条件语句*/
		x1=100;
	}
	return 0;
}

4.3.2 输出截屏

4.4 语法分析程序测试

4.4.1 测试源代码

/*
 测试程序
*/
  double y; //变量定义语句
  y=3.1415e-10; //变量赋值语句
  double z;//变量定义语句
  float a;
  a=12312;
  a=3.1e+5;
  a=.123e-2;
  a=4+(a-(1*a+y)/3)*y;
  z=(x1-3)*(4-y);//变量赋值语句
  if(y>=z)//if语句
   if(z<=y)
     z=y;
  while((z+y*15-7)>10)//while语句
   if(z<y)
    z=z-100;

4.4.2 输入token流

输入格式: 序号 类型 值

1 1 double
2 2 y
3 5 ;
4 2 y
5 4 =
6 3 3.1415e-10
7 5 ;
8 1 double
9 2 z
10 5 ;
11 1 float
12 2 a
......

5 实验总结

完成的工作

  • 设计要检测的语言
  • 设计和编写词法分析自动生成工具myLex
  • 设计和编写语法分析自动生成工具myYacc
  • 设计和编写词法分析程序
  • 设计和编写语法分析程序

完整的源码和详细的文档,上传到了 【WRITE-BUG数字空间】,需要的请自取: (www.writebug.com/code/0c46ee…)