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…)