递归下降分析程序
来源:互联网 发布:最新美化照片软件 编辑:程序博客网 时间:2024/05/16 08:35
实验二 递归下降分析程序
一、实验目的
1.通过本次实验,掌握自顶向下语法分析的要求与特点;
2.掌握递归下降语法分析的基本原理和方法;
3.学习程序设计语言的语法分析器的手工编程方法。
二、实验内容
将递归下降子程序分析方法运用于算术表达式文法。
三、实验原理
递归下降分析法是一种确定的自顶向下语法分析方法,它的基本方法是给文法每一个非终结符号设计一相应的子程序。由于文法的产生式往往是递归的,因而这些子程序也是递归的,也就是说,只要调用第一个产生式,程序就会执行到结束,其他子程序将会在其中被调用。
在不含左递归和每个非终结符的所有候选终结首符集都两两不相交的条件下,我们就可能构造一个不带回溯的自顶向下的分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。
四、算法思想
1.分析对象
算术表达式的BNF定义如下:
〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉
〈项〉→〈因式〉|〈项〉*〈因式〉|〈项〉/〈因式〉
〈因式〉→〈变量〉│(〈算术表达式〉)
〈变量〉→ i
用符号表示为:
G[E]: E→T|E+T|E-T
T→F|T*F|T/F
F→i│(E)
消除左递归后:
G’[E]: E→TE’
E’ →+TE’|-TE’|ε
T→FT’
T’→*FT’|/FT’|ε
F →i|(E)
2.设计思路
为5个非终结符每个分别设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。
产生式的右边指出这个函数的代码结构:
(1) 若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。
(2) 若是非终结符号,则调用与此非终结符对应的过程。当右部有多个产生式时,
可用选择结构实现。
五、具体实现
#include <bits/stdc++.h>using namespace std; char inputstream[50]; //存储输入字符串 int temp=0; //数组下标 int flag; //判断输出信息 void t();void e();void e1();void t1();void f();void e(){cout<<"E->TE'"<<endl; t(); e1(); } void e1(){if(inputstream[temp]=='+') { cout<<"E'->+TE'"<<endl; temp++; t(); e1(); } else if(inputstream[temp]=='-') { cout<<"E'->-TE'"<<endl; temp++; t(); e1(); } else if (inputstream[temp]!='#'||inputstream[temp]!=')') { cout<<"T'->^"<<endl; } else flag=0;}void t(){cout<<"T->FT'"<<endl; f(); t1();} void t1(){if(inputstream[temp]=='*') { cout<<"T'->*FT'"<<endl; temp++; f(); t1(); } else if(inputstream[temp]=='/'){cout<<"T'->/FT'"<<endl; temp++; f(); t1();} else if (inputstream[temp]!='#'&&inputstream[temp]!=')'&&inputstream[temp]!='+'&&inputstream[temp]!='-') { cout<<"T'->^"<<endl; flag=0; }}void f(){if(inputstream[temp]=='i'){cout<<"F->i"<<endl; temp++; }else if(inputstream[temp]=='('){cout<<"F->(E)"<<endl; temp++; e();if(inputstream[temp]==')'){cout<<"F->(E)"<<endl; temp++;}else flag=0; }else flag=0; }int main(){ flag=1; cout<<"请输入要分析的字符串以#结束(^为空字符):"<<endl; cin>>inputstream; e(); if((inputstream[temp]=='#')&&flag) cout<<"分析成功,是合法算术表达式!"<<endl; else cout<<"分析失败,不是合法算术表达式!"<<endl; return 0;}
- 递归下降分析程序
- 递归下降分析程序
- 编译原理(递归下降分析程序)
- 递归下降分析程序构造方法
- 递归下降分析法
- 递归下降分析子程序
- 递归下降分析法
- 递归下降分析
- 简单的递归下降分析
- 学习递归下降分析 Recursive Descent Parser
- 语法分析:算术表达式递归下降分析程序设计
- 递归下降分析法(编译原理)
- 基于递归下降分析法自制计算器
- 语法分析:算术表达式递归下降分析程序设计
- 编译原理—递归下降分析
- 实验三:递归下降分析法
- 递归程序分析
- 递归下降语法分析程序的设计与实现
- Java实现单链表反转
- 大型网站技术架构(六)——网站的伸缩性架构
- MySQL查询优化-explain
- 王坚博士专访 | 揭开国家 AI 创新平台“城市大脑”的神秘面纱
- 由FizzBuzz游戏感触到的动手编码能力的重要性!
- 递归下降分析程序
- PrintingTools启动失败,报错:Service failed to start Utilities.PrintingTools.GPServer: null
- 算法 程序步 / 由程序步判断程序高效低效
- SSMA 整合
- ES6学习笔记-ES6的概念
- 一些好的网站记录(PART 2)
- MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)
- Microservice架构模式简介
- 树莓派