第一部分 --- 构造递归下降分析器

1.在上面这个例子中则是子程序序A先调用子程序B,本程序结束完调用之后再返回来继续调用下一个符号

如果下一个符号是终结符的话那就直接进行匹配,不进行调用,匹配完后继续调用下一个符号

如果不是的话则调用这个非终结符对应的子程序,并重复步骤 1 

1.ADVANCE是一个字程序,作用是输入下一个符号

2.SYM则是指向当前输入的单词符号

1.一个非终结符的展开就等价于调用这个非终结符对应的语法分析子程序

1.一个非终结符对应的子程序就用这个非终结符本身来命名,比如非终结符A的子程序的命名就是A本身

2.上面这个设计中的Begin  A ;B  End 的意思是对于给定的候选式(假定候选式中有A和B,且A在B的前面(一般都将A设为候选式的开头,B设为候选式的结尾)),从候选式的A开始进行匹配,一直到匹配完B后结束匹配

3.如果待匹配字符属于非终结符的FEKKOW集合,且非终结符具有首符集合中具有空字医婆塞洛的候选式的话,我们就要选择这个候选式来进行匹配

选择空字候选式进行匹配在程序中的体现就是直接匹配成功,但是SYM不发生改变,ADVANCE不调用,而匹配程序继续往下执行

简单来说就是匹配程序执行一次什么都不做,然后继续执行后面的程序


第二部分 --- 梯度下降子程序设计示例

1.写出每个非终结符的递归下降子程序

1.绿色部分是在检验当前输入符号是不是属于非终结符的FELLOW集合

上面那种实现方式是在给定的字符不属于当前终结符的首字符集的时候,假设它属于当前非终结符的FELLOW集合,这就等价于假设这个字符是下一个非终结符 / 终结符的某个首字符集中的元素

到下一个非终结符进行匹配的时候,如果是的话那就正常匹配成功,如果不是的话就会匹配失败

此时采用上面那种方式和采用下面那种方式得到的结果都是一样的

1.主程序设计:读入字符,调用开始符号

2.主程序执行完毕之后,承接当前读取符号的SYM应该等于语句结束符号 ‘ # ’ ,如果不是的话就代表语法分析错误,返回REEOR


第三部分 --- 扩充的巴克斯范式和语法图

1.{α} --- α表示的是一个字符或者是字符串 , { α } 表示的则是阿尔法的闭包运算

2.上面那个任意重复0次至n次的意思是α的闭包运算可以任意重复0次到n次(重复0次就是不进行闭包运算,重复一次就是执行一次闭包运算)

1.左边上面那种文法表示形式是没有进行扩充时的巴克斯范式的表示方式

2.下面这种文法表示形式就是进行了扩充后的巴克斯范式的表示方式

3.右边则是各个非终结符的语法树

4.对于E非终结符而言,如果递归能够停止的话,得到的字符串的开头字符一定是T,而T的后面一定跟着若干个 +T ---- 这种形式等价于 T然后后面跟着 +T的闭包 --- 其实就是扩充后的巴克斯范式的表示 --- 而扩充后的巴克斯范式的语法图就是上图右边那样

1.上图是扩充后的巴克斯范式的程序实现:

首先匹配一次开头符号,然后是开始进行“闭包运算”,闭包运算的过程是:如果现在输入的符号是 闭包运算中的第一个符号的话(进入循环),那就将闭包运算中第一个符号后面的字符依次进行匹配,匹配成功之后如果现在输入的符号的依然等于闭包运算的第一个符号的话,那就继续进行闭包运算(循环判断条件)

编译原理 --- 递归下降分析器相关推荐

  1. 编译原理-递归下降分析器

    编译原理-简单的递归下降语法分析器LL(1) 在网上看了很多篇关于递归下降分析器的博文,均没有满意的,一是所写的程序不对.二是解释的不够清楚.所以想自己写一篇,顺便总结一下所学. 递归下降分析法 递归 ...

  2. 编译原理8:递归下降分析器、扩充巴斯克范式、JavaCC

    递归下降分析器 递归下降分析器设计示例 E'不考虑follow集的隐患会被后续的子程序考虑到,所以没有问题 扩充的巴科斯范式和语法图 JavaCC简介 小结

  3. C++:编译实验之递归下降分析器

    一.实验目的 1.加深对递归下降分析法一种自顶向下的语法分析方法的理解. 2.根据文法的产生式规则消除左递归,提取公共左因子构造出相应的递归下降分析器. 二.实验内容 根据课堂讲授的形式化算法,编制程 ...

  4. java实验文法报告_西安邮电大学编译原理LL文法分析器实验(java).doc

    西安邮电大学编译原理LL文法分析器实验(java) <编译原理>实验报告 题目: 语法分析器的制作 学生姓名: 班 级: 软件1202 学 号: 指导教师: 成 绩: 西安邮电大学计算机学 ...

  5. 《Python Cookbook 3rd》笔记(2.19):实现一个简单的递归下降分析器

    实现一个简单的递归下降分析器 问题 你想根据一组语法规则解析文本并执行命令,或者构造一个代表输入的抽象语法树.如果语法非常简单,你可以自己写这个解析器,而不是使用一些框架. 解法 在这个问题中,我们集 ...

  6. 编译原理简单语法分析器(first,follow,分析表)源码下载

    编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...

  7. 深入浅出编译原理-3-词法分析器

    引言 编译器的工作的开始,就是读入源码(预编译先不考虑),然后,去除一些空字符,然后经过词素匹配,并和其属性(可选),组成一个的词法单元,多个词法单元,连接成词法单元序列.自此,此法分析器的工作就算完 ...

  8. [编译原理]构造LR分析器和SLR移进归约分析表

    目录 目标 1.基础知识引入 1.1 文法 1.2 拓广文法 1.3 全部的项目集 2. 计算文法的LR(0)项目集的.识别活前缀的DFA 2.1 分析得到各个项目集 2.2 构建SLR分析表中的移进 ...

  9. 递归下降分析器的设计java_数据结构(Java版)教与学(48和60学时教学大纲)

    baba<数据结构>课程教学大纲课程中文名称: 数据结构.课程英文名称:Data Structures.课程类别:专业基础课 必修.课程学分数:4(16学时为1学分)课程学时数:讲课48学 ...

  10. 编译原理-6-LR语法分析器

    LR语法分析器 自顶向下的.不断归约的.基于句柄识别自动机的.适用于LR(∗) 文法的.LR(∗) 语法分析器 只考虑无二义性的文法 1. 构建语法树过程 自底向上构建语法分析树 根节点是文法的起始符 ...

最新文章

  1. Liferay7 BPM门户开发之11: Activiti工作流程开发的一些统一规则和实现原理(完整版)...
  2. [J2SE 基础知识]2、抽象类和接口(上)
  3. 关于美工ps出图table格式的处理
  4. java 3des解密过程_6. Java 加解密技术系列之 3DES
  5. java request 原理_JavaWeb-seession原理
  6. jquery mobile 从一个html的page跳转到另一个html的page
  7. 使用MetaMask实现转账交易时附带Input Data数据
  8. Java转JSON串的几种方式
  9. 【Python3网络爬虫开发实战】 1.5.4-RedisDump的安装
  10. [BUAA软工]团队贡献分博客
  11. python中右对齐_python中如何右对齐-问答-阿里云开发者社区-阿里云
  12. MySQL二进制部署
  13. swift野梦抄袭 taylor_如何看待蔡健雅新歌《半途》被指抄袭 Taylor Swift 的《Safe Sound》?...
  14. 期货市场的竞争与创新发展及其启示
  15. 信息安全数学基础自学笔记1——群
  16. 别羡慕苹果的小部件了,安卓也有!
  17. 基于JavaWeb+MySQL的简历信息管理系统
  18. image、border-image、background-image的区别
  19. golang中的字符串拼接
  20. CSDN 自定义博客栏目

热门文章

  1. 使用MySql的yearweek()函数和通过java的Calendar获取的时间是当前年份第几周的数值不一致的问题
  2. 图像处理之图像复原[逆滤波、维纳滤波、约束最小二乘法、Lucy-Richardson和盲解卷积复原]
  3. python嵩天ppt_嵩天python课程笔记1
  4. 【LeetCode】刷题工具
  5. 《室内设计软件Sketch Up零初级入门视频教程》
  6. base64原理(附代码) 换表脚本
  7. 车辆-轨道耦合动力学模型(持续更新)
  8. 一文读懂FFT,海宁窗(hann)和汉明窗(hamming)的区别,如何选择窗函数
  9. python高斯核函数_python 实现高斯核与卷积过程
  10. CAD图纸的保存格式DWG DWF DXF互相转换是怎么操作的?