概述
实验4《递归下降分析法设计与实现》
一、实验目的
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。
二、实验内容
程序输入/输出示例(以下仅供参考):
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
(1)E-TG
(2)G-+TG|—TG
(3)G-ε
(4)T-FS
(5)S-*FS|/FS
(6)S-ε
(7)F-(E)
(8)F-i
输出的格式如下:
(1)递归下降分析程序,编制人:姓名,学号,班级
(2)输入一以#结束的符号串(包括+—/()i#):在此位置输入符号串例如:i+ii#
(3)输出结果:i+ii#为合法符号串
备注:输入一符号串如i+i#,要求输出为“非法的符号串”。
注意:
1.表达式中允许使用运算符(±*/)、分割符(括号)、字符I,结束符#;
2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好)。
三、实验方法
1.实验采用C++程序语言进行设计,利用txt文本对源程序进行存储;
2.实验开发工具为Visual Studio Code。
四、实验步骤
1.对递归下降分析算法进行详细分析;
2.对文法中的每一个非终结符计算它们的Fisrt集,Follow集和Select集。
3.main函数编写,每遇到一个终结符,则需要判断所输入字符是否与之匹配,若匹配则读取下一个,若不匹配,则进行出错处理。
五、实验结果
- 实验测试所用语句如下所示:
- 实验测试结果:
测试结果符合预期结果,程序能够利用指定的文法对指定的语句进行正误判断。实验截图如下所示:
六、实验结论
1.实验利用自定义的源程序进行测试,结果正确,符合预期结果,测试源码及结果截图和说明如上所示。
2.实验源代码如下所示:
test4.cpp
/**************************
Compiler Principle
test4 递归下降分析法设计与实现
author:zz
vs code
2019.05.08
***************************/
/*
定义文法:
(1)E→TG
(2)G→ATG
(3)G→ε
(4)T→FH
(5)H→MFH
(6)H→ε
(7)F→i
(8)A→+
(9)A→-
(10)M→*
(11)M→/
*/
#include <iostream>
#include <fstream>
#include <dos.h>
#include <cstring>
#include <stdlib.h>
using namespace std;
char a[100], b[100], d[500], e[10];
char ch;
int n1,i1=0,flag=1,n=5;
int E1();
int E();
int G();
int T();
int H();
int F();
int A();
int M();
void input();
void input1();
void output();
//递归分析
int main()
{
int p;
char x;
d[0]='E';
d[1]='=';
d[2]=' ';
d[3]='T';
d[4]='G';
d[5]='#';
//从文件中读入除换行符之外的字符
ifstream infile("test4.txt",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
char c='c',f[50]= {""};
int i=0,k=0,l=0;
while(infile.peek()!=EOF)
{
infile.get(c);
if(c!='n')
{
f[i]=c;
i++;
}
}
//给操作数组a赋初值,依次进行操作
do
{
a[k]=f[l];
if(f[l]=='#')
{
cout<<"从文件读入字符串(长度<50,以#号结束)n";
for(int j=0; a[j]!='