递归下降分析子程序设计

  • 实验目的
  • 实验内容
  • 函数定义
  • 程序流程图
  • 源代码
  • 测试用例

实验目的

  掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递归调用程序的构造方法。

实验内容

 给定CP语言中简单算术表达式文法G[E]:
    E→TE’
    E’→ATE’|ε
    T→FT’
    T’→MFT’ |ε
    F→(E) | i
    A → + | -
    M → * | /
 根据该文法,编写递归下降分析子程序。
【说明】
 终结符号i为用户定义的简单变量,即专题1中标识符的定义

  1. 输入:是词法分析输出的二元组序列,即任意简单算术表达式经过专题1程序输出后得到的结果。【上述文法中i即对应词法分析的标识符, ±*/分别对应词法分析得到的运算符】
  2. 输出:判定输入串是否为该文法定义的合法算术表达式
  3. 处理:程序应能发现输入串的错误
  4. 设计5个以上的测试用例(尽可能完全,包括正确和出错情况),给出测试结果。

函数定义

 void E(char t); //非终结符号E的产生式函数void T(char t); //非终结符号T的产生式函数void Ep(char t); //非终结符号E’的产生式函数void Tp(char t); //非终结符号T’的产生式函数void F(char t); //非终结符号F的产生式函数void A(char t); //非终结符号A的产生式函数void M(char t); //非终结符号M的产生式函数void error();   //输出错误int main();   //递归下降分析主函数

程序流程图

源代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include <fstream>using namespace std;int index = 0;         //遍历字符串的当前位置
string str;
int flag=0;
void error();void E(char t);
void T(char t);
void Ep(char t);
void Tp(char t);
void F(char t);
void A(char t);
void M(char t);/*             i      (        )     +        -        *        /        $E  "::TE'" ,"::TE'", "null", "null" , "null" , "null" , "null" , "null",T  "::FT'" ,"::FT'", "null", "null" , "null" , "null" , "null" , "null",E' "null" ,"null", "::ε" , "::ATE'", "::ATE'", "null" , "null" , "::ε" ,A  "null" ,"null", "null", "::+"  , "::-"  , "null" , "null" , "null",F  "::i",  "::(E)","null", "null" , "null" , "null" , "null" , "null",M  "null", "null", "null", "null" , "null" , "::*"  , "::/"  , "null",T' "null", "null", "::ε" , "::ε"  , "::ε"  , "::MFT'", "::MFT'", "::ε" ,
*/void E(char t)
{if (t == '(') {cout << "E::TE'" << endl;T(str[index]);Ep(str[index]);}else if (t == 'i') {cout << "E::TE'" << endl;T(str[index]);Ep(str[index]);}else {error();index++;E(str[index]);}
}void T(char t)
{if (t == 'i') {cout << "T::FT'" << endl;F(str[index]);Tp(str[index]);}else if (t == '(') {cout << "T::FT'" << endl;F(str[index]);Tp(str[index]);}else{error();index++;T(str[index]);}
}void Ep(char t)
{if (t==')'){cout << "E'::ε" << endl;}else if (t == '+'){cout << "E'::ATE'" << endl;A(str[index]);T(str[index]);Ep(str[index]);}else if (t == '-'){cout << "E'::ATE'" << endl;A(str[index]);T(str[index]);Ep(str[index]);}else if (t=='$'){cout << "E'::ε" << endl;}else{error();index++;Ep(str[index]);}
}void Tp(char t)
{if (t == ')'){cout << "T'::ε" << endl;}else if (t == '+'){cout << "T'::ε" << endl;}else if (t == '-'){cout << "T'::ε" << endl;}else if (t == '*'){cout << "T'::MFT'" << endl;M(str[index]);F(str[index]);Tp(str[index]);}else if (t == '/'){cout << "T'::MFT'" << endl;M(str[index]);F(str[index]);Tp(str[index]);}else if (t == '$'){cout << "T'::ε" << endl;}else{error();index++;Tp(str[index]);}}void F(char t) {if (t == 'i') {cout << "F::i" << endl;index++;}else if (t == '(') {cout << "F->(E)" << endl;index++;E(str[index]);}else {error();index++;F(str[index]);}
}void A(char t)
{if (t == '+'){cout << "A::+" << endl;index++;}else if (t == '-'){cout << "A::-" << endl;index++;}else{error();index++;A(str[index]);}
}void M(char t)
{if(t == '*'){cout << "M::*" << endl;index++;}else if (t == '/'){cout << "M::/" << endl;index++;}else{error();index++;M(str[index]);}
}void error()
{cout << "有一个错误,略过当前词法记号" << endl;flag=1;
}int main()
{       cout<<"语法分析开始\n"<<endl;ifstream Prewords("test.txt", ios::in);getline(Prewords, str);E(str[index]);cout<<"\n语法分析完成"<<endl;if(flag==1)cout<<"当前语句不合法"<<endl;elsecout<<"当前语句合法"<<endl;return 0;
}

测试用例

1. (i-i)*i-i/i$
2. i+-i-i$

杭电编译原理实验-实验二-递归下降分析子程序设计相关推荐

  1. 编译原理中词法分析的递归下降分析法实例--能被5整除的二进制数---c语言实现

    一.前言 又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能-写实验报告.行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路.作 ...

  2. 【编译原理-专题二】递归下降分析子程序

    编译原理-递归下降分析子程序 一.程序功能描述 给定CP语言中简单算术表达式文法G[E]: E→TE' E'→ATE'|ε T→FT' T'→MFT' |ε F→(E) | i A → + | - M ...

  3. 编译原理|递归下降分析子程序

    递归下降分析子程序 一.实验目的 掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递归调用程序的构造方法. 二.实验内容 给定CP语言中简单算术表达 ...

  4. 《编译原理》实验报告——递归下降语法分析器的构建

    一.实验要求 运用递归下降法,针对给定的上下文无关文法,给出实验方案.预估实验中可能出现的问题. 二.实验方案 1.构造LL(1),通过设计.编制.调试递归下降语法分析程序,对输入的符号串进行分析匹配 ...

  5. 《编译原理》实验预习报告——递归下降语法分析器的构建

    一.实验目的 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析.本次实验的目的主要是加深对递归下降分析法的理解. 二.实验预习提示 1.递归下降分析法的功能 词法分析器的功能是利用 ...

  6. c语言的适当大小的子集,编译原理上机实验报告

    编译原理上机实验报告,编制C语言子集的词法分析程序,编制递归下降法的语法分析程序 编译技术上机实验题目 实验一 一.题目 编制C语言子集的词法分析程序 二.目的 通过设计.编制.调试一个具体的词法分析 ...

  7. 《编译原理》实验教学大纲

    <编译原理>实验教学大纲 课程编号: 773033 课程名称:编译原理 英文名称:Compiler Principle 课程类型: 模块课 学 时:5 学 分:4 适用对象: 软件开发各专 ...

  8. 【编译原理】 实验三 LL(1)分析法(LL1分析表的自动生成)

    写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...

  9. 【SEUSE】编译原理 - 词法分析器实验报告

    [SEU&SE]编译原理 - 词法分析器实验报告 README 一. 实验目的 二. 实验环境 1. 开发环境: 2. 运行环境 三. 实验内容 1. 主要内容 2. 主要功能 3. 种别码 ...

最新文章

  1. 强烈推荐10个新媒体运营必备工具,极大提高工作效率
  2. GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size...
  3. java不同类之间参数传递_《java基础》整型包装类之间值得比较
  4. __VA_ARGS__宏
  5. Matlab | Matlab从入门到放弃(1)——变量
  6. 《看聊天记录都学不会C语言?太菜了吧》(11)2分钟领悟数组
  7. java集合框架的接口_Java集合框架——Set接口
  8. 西安工业大学计算机全国排名,西安工业大学北方信息工程学院排名2018年下滑14名 在独立学院中实力排全国第138名...
  9. PHP:Iterator(迭代器)接口和生成器
  10. java 泛型 多态_Java 多态
  11. vlookup使用步骤_使用vlookup出错,看看原因多为这几个!快来看看!
  12. Java Web学习笔记12:CKEditor在线编辑器
  13. eclipse集成python插件
  14. [导入]DataHelper
  15. win用户计算机批量添加用户,在WIN2K3AD中用dsadd批量添加域用户
  16. 常见springboot依赖包关系
  17. HowNet介绍及相关API的使用方法
  18. android自动调节背光,android自动调节背光
  19. 卷积可视化网站---CNN初学者的神器
  20. python笑脸猫图案_酷叮猫编程课堂:python生成字符画

热门文章

  1. Tcl-2.常用列表操作命令
  2. 陀螺仪GY25Z使用
  3. 开源运动发展史与开源许可证(BSD、GPL、Apache、MIT、木兰(中国))的那些事儿
  4. C1认证学习八(域名解析)
  5. 代码出错了,该怎么排查呢
  6. Unity3D制作3dRPG游戏——主角移动控制实现
  7. mysql 导入sql文件 外键报错_为什么MySQL在导入时会忽略外键?
  8. 给 Visual Studio 换颜色
  9. ESP8266开发之旅 WebServer篇⑥ DS18B20 Web Server
  10. JVM调优总结 (转载)