编译原理|递归下降分析子程序
递归下降分析子程序
一、实验目的
掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递归调用程序的构造方法。
二、实验内容
给定CP语言中简单算术表达式文法G[E]:
E→TE’
E’→ATE’|ε
T→FT’
T’→MFT’ |ε
F→(E) | i
A → + | -
M → * | /
根据该文法,编写递归下降分析子程序。
【说明】
终结符号i为用户定义的简单变量,即词法分析中标识符的定义
- 输入:是词法分析输出的二元组序列,即任意简单算术表达式经过专题1程序输出后得到的结果。【上述文法中i即对应词法分析的标识符, ±*/分别对应词法分析得到的运算符】
- 输出:判定输入串是否为该文法定义的合法算术表达式
- 处理:程序应能发现输入串的错误
- 设计5个以上的测试用例(尽可能完全,包括正确和出错情况),给出测试结果。
三、实验要求
- 根据递归下降子程序要求,为每个非终结符号写一个函数,然后根据文法右部
提示:文法可保存为文本文件形式,每行表示一条产生式,左右两部分通过::来区分,如:
E :: T E’
E’ :: A T E’
E’ :: ε
……
注意选择合适的数据结构来存储产生式规则【主要涉及到非终结符号集合、终结符号集合等】。 - 任选一种编程语言实现递归下降分析程序
四、实验代码
#include<stdio.h>
#include<iostream>
char a[10];
int p=0; //指针 指向下一个符号
void E(); // E:: T E1
void E1(); // E1::A T E1 / 无
void T(); // T::F T1
void T1(); // T1:: M F T1 / 无
void F(); // F:: ( E ) / id
void A(); // A:: + / -
void M(); // M:: * / /int main(){printf("输入以#结尾的字符串:");gets(a);E();if(a[p]=='#')printf("符合,正确");elseprintf("错误,不符合");return 0;
}void E(){printf("E->TE'\n");T();E1();
}void E1(){if(a[p]=='+'||a[p]=='-'){printf("E1->ATE'\n");A();T();E1();}elseprintf("E'->ε\n");
}void T(){printf("T->FT'\n");F();T1();
}void T1(){if(a[p]=='*'||a[p]=='/'){printf("T1->MFT'\n");M();F();T1();}elseprintf("T'->ε\n");
}void F(){if(a[p]==('i')){printf("F->i\n");p++;}else if(a[p]=='('){p++;E();if(a[p]==')'){printf("F->(E)\n");p++;}else{printf("error!\n");exit(0);}}else{printf("error!\n");exit(0);}}void A(){if(a[p]=='+'){printf("A->+\n");p++;}else if(a[p]=='-'){printf("A->-\n");p++;}else{printf("error!\n");exit(0);}
}void M(){if(a[p]=='*'){printf("M->*\n");p++;}else if(a[p]=='/'){printf("M->/ \n");p++;}else{printf("error!\n");exit(0);}
}
五、结果分析
编译原理|递归下降分析子程序相关推荐
- 【编译原理-专题二】递归下降分析子程序
编译原理-递归下降分析子程序 一.程序功能描述 给定CP语言中简单算术表达式文法G[E]: E→TE' E'→ATE'|ε T→FT' T'→MFT' |ε F→(E) | i A → + | - M ...
- 杭电编译原理实验-实验二-递归下降分析子程序设计
递归下降分析子程序设计 实验目的 实验内容 函数定义 程序流程图 源代码 测试用例 实验目的 掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递 ...
- 编译原理-递归下降分析器
编译原理-简单的递归下降语法分析器LL(1) 在网上看了很多篇关于递归下降分析器的博文,均没有满意的,一是所写的程序不对.二是解释的不够清楚.所以想自己写一篇,顺便总结一下所学. 递归下降分析法 递归 ...
- 编译原理中词法分析的递归下降分析法实例--能被5整除的二进制数---c语言实现
一.前言 又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能-写实验报告.行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路.作 ...
- 递归下降分析法(编译原理)
递归下降分析法的实现方案 递归下降分析法的原理是利用函数之间的递归调用模拟语法树自上而下的构造过程,具体实现方法概述如下: 1)每个非终结符对应一个解析函数: 2)产生式右侧为该产生式左侧非终结符所对 ...
- 递归下降分析法的基本思想。_语法分析 | 递归下降分析算法
递归下降分析算法是自顶向下分析算法的一部分. 递归下降分析算法 也称为预测分析 分析高效(线性时间) 容易实现(方便手工编码) 错误定位和诊断信息准确 被很多开源和商业的编译器所采用 GCC 4.0, ...
- 语法分析:自上而下分析(递归下降分析法+预测分析法)
语法分析:自上而下分析 目录 语法分析:自上而下分析 知识背景 递归下降分析法 内容一:根据文法生成子程序 内容二:调用文法开始符号所对应的子程序 预测分析法 内容一:构造预测分析表 内容二:预测分析 ...
- 递归下降分析法实现强化计算器
一. 实验概述 1.使用bison 和 flex 实现扩展版计算器 该计算器支持实型的两种表达,分别是小数和科学计数法. 该计算器支持 加, 减, 乘 除 四种运算 和括号()运算符. 该计算器支持整 ...
- 自上而下的语法分析-递归下降分析和LL(1)文法
对输入的任意单词符号串,试图用一切可能的办法,从文法开始符号(树根)出发,自上而下.自左而右地建立起一棵语法分析树,使得该树的叶结点自左而右地排列起来,刚好就是所给的输入串.显然,这一过程应该与一个最 ...
最新文章
- UnicodeEncodeError: ‘locale‘ codec can‘t encode character ‘\u5e74‘ in position 2: Illegal byte seque
- About LOCAL_PRIVATE_PLATFORM_APIS in Android.mk
- 手把手教你搭建Linux开发环境(VMware+Ubuntu)(四)——gcc编译器的安装和使用
- java语言for模板_java版的模板语言
- Hadoop YARN安装部署初探
- Excel Chart
- [z]IE6各种不兼容问题
- 用python语言模拟微信红包_python 模拟微信抢红包 基础语法实现demo
- (一)Nand FLASH 原理讲解
- 如何把TS视频文件转换为MP4格式?
- java实现报数游戏
- 处理器最新排行_鲁大师Q2季度PC硬件排行:Intel十代酷睿初入战局,最受欢迎CPU是它...
- java_opts=quot;-server,tomcat高并发的配置
- 华为服务器维修报告,服务器运维报告
- Part GeoAI----当ArcGIS遇上人工智能
- Redy语法分析--抽象语法树简介
- Pandas 数据挖掘 分析
- WireShark流量分析(中国菜刀,webshell)
- 安装EVA后可能出现无法在EVA输入中文的解决方法
- 移动互联网的创业机会在哪