编译原理 实验4《递归下降分析法设计与实现》

本次实验旨在通过C++实现递归下降分析程序,对特定文法的输入符号串进行分析。实验内容包括文法分析、错误处理,并在Visual Studio Code上开发。结果显示程序能正确判断表达式的合法性,加深了对递归下降分析法的理解。实验中遇到的逻辑问题通过查阅资料解决,未来将优化代码可读性和算法逻辑。
摘要由CSDN通过智能技术生成
实验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. 实验测试结果:
    测试结果符合预期结果,程序能够利用指定的文法对指定的语句进行正误判断。实验截图如下所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
六、实验结论

  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]!='\0'; j++)
                cout << a[j];
            n1=i;
            ch=b[0]=a[0];
            cout<<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值