一、实验要求

运用递归下降法,针对给定的上下文无关文法,给出实验方案。预估实验中可能出现的问题。

二、实验方案

1、构造LL(1),通过设计、编制、调试递归下降语法分析程序,对输入的符号串进行分析匹配,观察输入符号串是否为给定文法的句子。

2、根据LL(1)写函数和程序

三、预估问题

应确保LL(1)构造成功,不然程序会出错

理论基础

递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。

递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。

每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。

自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。

无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。

无左递归:既没有直接左递归,也没有间接左递归。

无回溯:对于任一非终结符号U的产生式右部x1|x2|…|xn,其对应的字的首终结符号两两不相交。

如果一个文法不含回路(形如P⇒+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。

四、内容和步骤

1、针对4.8习题输入和输出的设计及代码

2、针对现场给定语法的设计和处理

【考虑简单算术表达式文法G:

E→E + T | T

T→T * F | F

F→(E) | id

试设计递归下降分析程序,以对任意输入的符号串进行语法分析。】

3、实验具体步骤

(1)输入字符串,后并加上$符号

(2)匹配字符,若成功,输出并换行,若遇到非终结符,输出空格,若遇到错误,输出字符和位置。

针对给定语法进行设计:

E->E+T|T
T->TF|F
F->(E)|id
E->TE’
E’->+TE’|ε
T->FT’
T’->FT’|ε
F->(E)|id
First(E)={(,id}
First(E’)={+, ε}
First(T)={(,id}
First(T’)={, ε}
First(F)={(,id}
Follow(E)={KaTeX parse error: Expected 'EOF', got '}' at position 3: ,)}̲ Follow(E’)={,)}
Follow(T)={+,KaTeX parse error: Expected 'EOF', got '}' at position 3: ,)}̲ Follow(T’)={+,,)}
Follow(F)={*,+,$,)}

五、实验结果

代码

#include<iostream>
#include<string>
#include<math.h>
using namespace std;
string str;
int pos;
bool flag;
void lexp_seq();
void lexp_seq1();
char judge(char ch)
{if(ch >= '0' && ch <= '9') return 'n';else if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) return 'a';else return ch;
}
void error(char ch)
{if (flag) return;else flag = false;cout<<endl<<"error:"<<ch<<",position:"<<pos;
}void match(char kind, char ch)
{cout<<kind<<": "<<ch<<endl;pos++;
}void atom()
{if(!flag) return;char ch= judge(str[pos]);if(ch=='n') match('n', str[pos]);else if(ch=='a') match('a', str[pos]);else if(ch=='$') cout<<"accept"<<endl;else error(ch);
}
void list()
{if(!flag) return;match('l', '(');cout<<" ";lexp_seq1();if(str[pos] == ')') match('r',')');else error(str[pos]);
}void lexp()
{if(!flag) return;char ch= judge(str[pos]);if(ch == 'n' || ch == 'a'){cout<<" ";atom();}else if(ch == '('){cout<<" ";list();}else if(ch == '$' ) cout<<"accept"<<endl;else error(ch);
}void lexp_seq1()
{if(!flag) return;char ch= judge(str[pos]);if(ch == 'n' || ch == 'a' || ch == '(') {cout<<" ";lexp();cout<<" ";lexp_seq1();}else if(ch == ')') match('r', ')');else if(ch == '$') cout<<"accept"<<endl;else error(ch);
}int main()
{pos = 0;flag = true;cin>>str;str +='$';lexp_seq1();return 0;
}

截图

六、实验结论

1 、实验结论

通过设计、编制、调试递归下降语法分析程序,对输入的符号串进行分析匹配,观察输入符号串是否为给定文法的句子,输出其语法树。

2、分析和总结

1)对输入设计的结论

按照4.8的输入

2)对输出设计的结论

输出一个语法树,不受界面尺寸限制

3)对递归下降法的算法的结论

递归下降分析法是一种自顶向下的分析方法,文法的每个非终结符对应一个递归过程(函数)。分析过程就是从文法开始符出发执行一组递归过程(函数),

这样向下推导直到推出句子;或者说从根节点出发,自顶向下为输入串寻找一个最左匹配序列,建立一棵语法树。

3、对预估问题的结论

预估问题未发生

资源下载

第四次上机作业 语法分析2

参考文章

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

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

编译原理实验二 递归下降语法分析器的构建

编译原理与实践第四章答案

《编译原理》实验报告——递归下降语法分析器的构建相关推荐

  1. 编译原理 - 实验三 - 递归下降语法分析器的调试及扩展

    一. 语法分析介绍 语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备.执行语法分析任 ...

  2. 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc

    递归下降语法分析器实验报告 编译原理实验报告 题目: 递归下降语法分析器 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 宁剑 指导教师 ...

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

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

  4. 编译原理实验-递归下降语法分析器的构建

    实验目的: 针对给定的上下文无关文法,编制一个递归下降分析程序. 分析: 递归下降语法分析的前提是保证LL(1)文法 递归下降的思路就是暴力dfs.对每个程序直接不管三七二十一搜进去,只要能搜到就继续 ...

  5. 编译原理实验二 自上而下的语法分析器(算术表达式)

    1.语法分析器比之前的词法分析器简单一些,要做语法分析,首先我们需要词法分析器将输入的算术表达式进行分解,将其变为一个String数组,这样我们可以依次对每一个词进行匹配. 2.在执行匹配的时候,思想 ...

  6. 递归下降语法分析器的构建_一文了解函数式查询优化器Spark SQL Catalyst

    大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据!记录一下个人对sparkSql的catalyst这个函数式的可扩展的查询优化器的理解,目录如下: 0. O ...

  7. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

  8. c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc

    词法分析器的设计与实现 编译原理实验报告 中北大学软件学院 实 验 报 告 专 业 软件工程 课程名称 编译原理 学 号 姓 名 辅导教师 张静 成绩 实验日期2015.5.19实验时间14:00~1 ...

  9. 编译原理上机实习c语言小子集编译程序的实现报告,合肥工业大学编译原理实验报告(完整代码版)...

    <合肥工业大学编译原理实验报告(完整代码版)>由会员分享,可在线阅读,更多相关<合肥工业大学编译原理实验报告(完整代码版)(58页珍藏版)>请在人人文库网上搜索. 1.计算机与 ...

最新文章

  1. C++_向函数传递对象
  2. 用python绘制图形_python绘制图形
  3. 谈谈微服务中的 API 网关(API Gateway)
  4. python3怎样交换数字顺序_python中怎么交换列的顺序
  5. 教你吃透CSS的盒子模型(Box Model)
  6. linux下dns服务器安装,Linux下DNS服务器安装配置方法详细介绍
  7. 挂载镜像SD卡的FAT32文件系统分区到Linux中
  8. stm32f7网口_STM32F7串口通信问题
  9. 关于latex的网站推荐
  10. 计算机培训excel的制作,绵阳电脑excel表格制作教程
  11. 推荐一款轻量级的支持Markdown的团队知识分享开源软件
  12. 物联网技术及应用计算机,物联网的关键技术及计算机物联网的应用
  13. 给Rstudio修改背景和字体等设置教程
  14. 开启usb调试的手机如何去除屏幕锁密码
  15. 对圆柱面的曲面积分_积分曲面为圆柱面的曲面积分的计算
  16. 马斯克要买地当「城主」/ 苹果手表引入ChatGPT/ 小鹏辟谣多名核心高管离职…今日更多新鲜事在此...
  17. 云服务器怎么多人进去编辑文档,有道云协作怎么实现多人协同编辑 多人同时处理文档方法...
  18. 二极管选型-二极管参数介绍
  19. 斯坦福教授告诉你:什么是元学习「 CS330 笔记 (三) 」
  20. Android产品研发(十)--尽量不使用静态变量保存数据

热门文章

  1. 用C#制作PDF文件全攻略(转)
  2. 以Post方式发送数据采用WebClient
  3. 西南交大计算机专硕就业怎么样,国内四所交通大学,有985也有211,就业、深造容易,值得报考...
  4. bp神经网络_BP 神经网络驱动的手写体数字识别软件 EasyOCR
  5. java handler null_java – 在调用之前,如何确保另一个Thread的Handler不为null?
  6. map集合怎么取value值最大的前三_Java之集合(下)
  7. tsp 分支界限 java_干货 | 10分钟教你用branch and bound(分支定界)算法求解TSP旅行商问题...
  8. 分布式内存数据库---redis配置文件常用配置介绍
  9. 深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
  10. 七十五、栈+双指针,头条当年接雨水问题