所谓LL1(1)文法是一种预测分析文法。

从文法的开始符号出发,从每一步推导过程中根据当前句型的最左非终结符A和当前输入符号a能够就能够确定出一个产生式。这样就是预测分析文法的工作过程。仔细想这个过程,假设有S -> aBC 和 S->aDE两个产生式,当输入指针指向a的时候,发现两个产生式都是合适的,那么我们应该选择那个产生式呢?这就是预测分析文法会面临的问题,这个就涉及到我们所说的FOLLOW集合等概念了。

LL(1)文法的意思是:L(从左往右输入,每次读入一个非终结符进行推导),L(产生式使用最左推导),1表示每次每一步只需要向前看一个符号就能确定下一步的语法分析动作。那么LL1文法是怎么确定分析动作的唯一性呢?我们首先了解三个概念:

1. FOLLOW集:FOLLOW(A)表示非终结符A的后继符号集。意思是在某个句型中能够紧跟在A后边的终结符a的集合。定义如下:

是不是感觉有点抽象?我们举个例子:

比如上面的文法S。我们看B:B有三个产生式分别是(2)(3)(4),从(1)我们可以按照FOLLOW的定义推导出来S => aBC => aB(a|c) 所以从定义的角度,我们就可以确定,ac是B的follow集合的元素了。所以,当我们要推导B的时候,当输入是b和d的时候我们能够分别确定是产生式(2)(3),当输入是ac的时候,我们就知道只能用(4)了。

2. SELECT产生式的可选集SELECT。 产生式的可选集表示的是可以选用该产生式进行推导的对应的输入符号的集合,记为SELECT(A->β)。

这个相对来说好理解一下,比如SELECT(A -> aβ) = {a}这是因为对于这个产生式,当当前输入符号为a的时候,可以用这个产生式来进行推导。

3. 串首非终结符集合FIRST.

给定一个文法符号穿α,α的串首终结符FIRST(α)定义为可以从α推导出的所有串首终结符构成的集合。如果α能推导出空串,那么空也被记为FIRST(α)中。

有了上面的概念,我们就可以定义LL1文法了:

看起来很复杂,我们来解释一下:

(2)α和β至多能有一个推导出空串。因为如果α和β都包括空串,那么对于SELECT(A->α)和SELECT(A->β)中就都包含了FOLLOW(A)中的元素。也就是两个的SELECT集合是相交的。这样不符合唯一性,因为这样会导致多个可选的终结符。

(3)条件,为什么FIRST(α)和FOLLOW(A)交集是空呢?因为如果β能推导出空串,那么SELECT(β)就包含FOLLOW(A)中的元素了。如果FIRST(α)和FOLLOW(A)有交集,那么SELECT(A->α)和SELECT(A->β)就会有交集。这样同样不符合唯一性。下面一个条件同理。

其实上面的所有条件,就是为了保证同一个产生式的可选集SELECT不相交。这样就可以保证对于推导过程中的任何一个非终结符,都有唯一对应的非终结符。这样就可以为LL1文法构造分析器。

LL(1)文法与其对应的FOLLOW,SELECT和FIRST集相关推荐

  1. LL(1)文法构造FIRST、FOLLOW、分析表并分析

    一.实验目的 学生运用编译原理的知识在实验技能和方法自行设计实验方案并加以实现. 二.使用仪器.器材 计算机一台 操作系统:Windows10 编程软件:Intellij IDEA 三.实验内容及原理 ...

  2. LL(1)文法中FIRST集和FOLLOW集的计算方法

    文章目录 深入理解 FIRST集的定义 FIRST集的实际意义 FIRST集的计算方法 FOLLOW集的定义 FOLLOW集的实际意义 FOLLOW集的计算方法 预测分析表的实质 LL(1)文法的判断 ...

  3. 编译原理中LL(1)文法求FIRST集和FOLLOW集的方法

    一.求FIRST集 1.右部首个字符是终结符则加入左部字符的FIRST集中,比如对形如U->a-的产生式(其中a是终结符),把a收入到FIRST(U)中. 2.右部首个字符是非终结符, 若此非终 ...

  4. mybatis mysql cursor_MySQL JDBC/MyBatis Stream方式读取SELECT超大结果集

    情景: 遍历并处理一个大表中的所有数据, 这个表中的数据可能会是千万条或者上亿条, 很多人可能会说用分页limit--但需求本身一次性遍历更加方便, 且Oracle/DB2都有方便的游标机制. 对DB ...

  5. hibernate select 读取结果集的两种办法

    第一种:推荐: DAO层的Hql语句如果用From.....执行出来的是一个基于Map结构的List,而用select.........执行出来的结果不是Map型的,为了方便使用.维护修改,将其转为基 ...

  6. php调用mysql查询结果_php - 在php脚本中处理select查询结果集

    在php脚本中执行select查询命令,也是调用mysql_query()函数,但是和执行DML不同的是,执行SELECT 命令后,mysql_query()函数的返回值是一个资源的引用指针(结果集) ...

  7. jquery操作select - 代码合集

    //为Select添加事件,当选择其中一项时触发 $("#select").change(function(){var val = $("#select").v ...

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

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

  9. 第四章:文法中的递归以及消除方法

    在介绍递归文法之前,首先介绍一下递归下降分析器及其原理,然后分析右递归是如何处理的,再来分析左递归和间接左递归. 递归下降分析器 自顶向下语法分析的目的是为输入串寻找最左推导,或者说,从根节点(文法开 ...

最新文章

  1. linux+postfix+extmail+dovecot搭建邮件服务器
  2. 用了5年的旧笔记本不要丢,1/4新机价格升级机器学习战斗本,隔壁研究员都馋哭了...
  3. java投票锁_Java并发编程锁之独占公平锁与非公平锁比较
  4. mongodb php 报错,PHP5 mongodb 切换db报错 Authentication failed on database admin-汗血宝马
  5. WinJS实用开发技巧(2):使用artTemplate打造对话列表
  6. c语言自动ejter,Skinnskalle eller ej, ingen ska behöva dö för sina åsikter
  7. 【渝粤教育】广东开放大学 土木工程材料 形成性考核 (22)
  8. [html] HTML5的video在手机端如何实现进来页面时就自动播放?
  9. 左神算法进阶班5_3求公司的最大活跃度
  10. Spark基础学习笔记04:搭建Spark伪分布式环境
  11. Ajax的load方法
  12. saber仿真软件_返场预订,视频课程丨开关电源环路补偿设计与仿真
  13. mysql物流管理系统_物流配送中心管理系统(SSM+MYSQL)
  14. 5G及移动边缘计算(MEC)学习笔记(1)
  15. 射频识别技术——数据编码
  16. springboot 集成 log4j,log4j配置不同包不同日志输出级别(按包输出不同级别日志)
  17. JavaScript的发展史
  18. 巨头环伺下,青云QingCloud的云计算之路危机重重
  19. Mac苹果键盘多个按键没响应该如何解决呢
  20. android 框架搭建养成的良好习惯(一)

热门文章

  1. 学python能做什么类型的工作-Python职业机会–是否值得学习Python?
  2. python练手经典100例-20个Python练手经典案例,能全做对的人确实很少!
  3. python中文读音-python中文谐音 Python 的中文谐音是什么?
  4. win7系统启用与配置语音识别功能的操作方法
  5. Android科大讯飞语音识别源码及API下载
  6. 超级计算机运行吃鸡,决赛圈的时候,如果两个人同时被手雷炸死该怎么办呢?...
  7. wincc和matlab通信,Matlab与WinCC之间的数据通信.doc
  8. 用java有理数类包含加减乘除_用java具体代码实现分数(即有理数)四则运算
  9. java static关键字_Java基础:static关键字作用总结
  10. 解决岛屿类问题(网格)通用解法DFS(附题)