杭电编译原理实验-实验二-递归下降分析子程序设计
递归下降分析子程序设计
- 实验目的
- 实验内容
- 函数定义
- 程序流程图
- 源代码
- 测试用例
实验目的
掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递归调用程序的构造方法。
实验内容
给定CP语言中简单算术表达式文法G[E]:
E→TE’
E’→ATE’|ε
T→FT’
T’→MFT’ |ε
F→(E) | i
A → + | -
M → * | /
根据该文法,编写递归下降分析子程序。
【说明】
终结符号i为用户定义的简单变量,即专题1中标识符的定义
- 输入:是词法分析输出的二元组序列,即任意简单算术表达式经过专题1程序输出后得到的结果。【上述文法中i即对应词法分析的标识符, ±*/分别对应词法分析得到的运算符】
- 输出:判定输入串是否为该文法定义的合法算术表达式
- 处理:程序应能发现输入串的错误
- 设计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$
杭电编译原理实验-实验二-递归下降分析子程序设计相关推荐
- 编译原理中词法分析的递归下降分析法实例--能被5整除的二进制数---c语言实现
一.前言 又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能-写实验报告.行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路.作 ...
- 【编译原理-专题二】递归下降分析子程序
编译原理-递归下降分析子程序 一.程序功能描述 给定CP语言中简单算术表达式文法G[E]: E→TE' E'→ATE'|ε T→FT' T'→MFT' |ε F→(E) | i A → + | - M ...
- 编译原理|递归下降分析子程序
递归下降分析子程序 一.实验目的 掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递归调用程序的构造方法. 二.实验内容 给定CP语言中简单算术表达 ...
- 《编译原理》实验报告——递归下降语法分析器的构建
一.实验要求 运用递归下降法,针对给定的上下文无关文法,给出实验方案.预估实验中可能出现的问题. 二.实验方案 1.构造LL(1),通过设计.编制.调试递归下降语法分析程序,对输入的符号串进行分析匹配 ...
- 《编译原理》实验预习报告——递归下降语法分析器的构建
一.实验目的 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析.本次实验的目的主要是加深对递归下降分析法的理解. 二.实验预习提示 1.递归下降分析法的功能 词法分析器的功能是利用 ...
- c语言的适当大小的子集,编译原理上机实验报告
编译原理上机实验报告,编制C语言子集的词法分析程序,编制递归下降法的语法分析程序 编译技术上机实验题目 实验一 一.题目 编制C语言子集的词法分析程序 二.目的 通过设计.编制.调试一个具体的词法分析 ...
- 《编译原理》实验教学大纲
<编译原理>实验教学大纲 课程编号: 773033 课程名称:编译原理 英文名称:Compiler Principle 课程类型: 模块课 学 时:5 学 分:4 适用对象: 软件开发各专 ...
- 【编译原理】 实验三 LL(1)分析法(LL1分析表的自动生成)
写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...
- 【SEUSE】编译原理 - 词法分析器实验报告
[SEU&SE]编译原理 - 词法分析器实验报告 README 一. 实验目的 二. 实验环境 1. 开发环境: 2. 运行环境 三. 实验内容 1. 主要内容 2. 主要功能 3. 种别码 ...
最新文章
- 强烈推荐10个新媒体运营必备工具,极大提高工作效率
- GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size...
- java不同类之间参数传递_《java基础》整型包装类之间值得比较
- __VA_ARGS__宏
- Matlab | Matlab从入门到放弃(1)——变量
- 《看聊天记录都学不会C语言?太菜了吧》(11)2分钟领悟数组
- java集合框架的接口_Java集合框架——Set接口
- 西安工业大学计算机全国排名,西安工业大学北方信息工程学院排名2018年下滑14名 在独立学院中实力排全国第138名...
- PHP:Iterator(迭代器)接口和生成器
- java 泛型 多态_Java 多态
- vlookup使用步骤_使用vlookup出错,看看原因多为这几个!快来看看!
- Java Web学习笔记12:CKEditor在线编辑器
- eclipse集成python插件
- [导入]DataHelper
- win用户计算机批量添加用户,在WIN2K3AD中用dsadd批量添加域用户
- 常见springboot依赖包关系
- HowNet介绍及相关API的使用方法
- android自动调节背光,android自动调节背光
- 卷积可视化网站---CNN初学者的神器
- python笑脸猫图案_酷叮猫编程课堂:python生成字符画