first、follow、select集合求法及LL1文法判别
来源:互联网 发布:道光知乎 编辑:程序博客网 时间:2024/05/17 20:22
一、原理部分
原理部分摘自清华大学出版社出版的《编译原理》一书。原理如下:
1.计算能推出空的非终结符。
2.计算first集合
求出每个非终结符的first集合
求出每个表达式右部字符串的first集合
3.计算follow集合
4.计算select集合
书上的select集合只是给了一个例子,具体的实现思路说明:
5.判别LL1文法
书上同样给了一个例子,具体的实现思路说明:
二、实现思路
1.求非终结符能否推出空
原理部分很详细,根据原理部分即可实现。
2.first集合
添加终结符及空
若X∈ε,则ε∈FIRST(X)
若X=a...,若a∈VT,则a∈FIRST(X);
添加非终结符
若有表达式α->X1X2...Xn,Xi为非终结符
<1>将FIRST(X1)中的一切非ε的终结符加进FIRST(α);
<2>若ε∈FIRST(X1),则将FIRST(X2)中的一切非ε的终结符加进FIRST(α);
<3>若ε∈FIRST(X1)且ε∈FIRST(X2),则将FIRST(X3)中的一切非ε的终结符加进FIRST(α);
<4>依此类推,若对于一切1≤i≤n,ε∈FIRST(Xi),则将ε加进FIRST(α)。
3.follow集合
若为开始符号,则把“#”加入FOLLOW(S)中;
若B→aAb(b≠ε),则把FIRST(b)-{ε}加入FOLLOW(A)中; 注:FOLLOW集合中不能有ε
若B→aA 或B→aAb,且b=>*ε 则把FOLLOW(B)加入FOLLOW(A) 中
4.select集合
对于产生式A—>α。集合select(A—>α)定义如下:
若α不能推出ε,则select(A—>α) = first(α)。
若α能推出ε,则select(A—>α)= {first(α)-{ε}}∪ follow(A)。
5.LL1文法
遍历所有表达式,取具有相同左部的表达式的select集合,将这些具有相同左部表达式的select集合取交集。
只要有一组相同左部表达式交集不为空,则该文法非LL1文法。
只有所有相同左部表达式交集都不为空,则为LL1文法。
三、代码实现部分
LL1文法判别
- first、follow、select集合求法及LL1文法判别
- LL(1)文法判别之First集合、Follow集合、Select集合求法
- 编译原理:first集合和follow集合的求法及LL(1)文法判定
- LL1文法分析(First集,Follow集,Select集,ll分析表,语句分析)
- First/Follow集合的求法
- 编译原理FIRST集、FOLLOW集、SELECT集求法通俗解释 & LL(1)文法判定
- FIRST集合与FOLLOW集合求法
- follow集 first集 LL(1)文法判别
- 编译原理-First集合和Follow集合的求法
- 编译原理-First集合和Follow集合的求法
- 编译原理中的first,follow和select集的求法
- 编译原理FIRST集合FOLLOW集的求法
- 汇编语言中的first和follow集合的求法
- First集合和Follow集合的求法(修改含例子)
- FIRST集合FOLLOW集
- 预测分析表中的FIRST和FOLLOW集合求法个人小结
- First集和Follow集的求法
- First集和Follow集的求法
- 关于Hibernate的几点回顾:get/load/SessionFactory/延迟加载
- 递推递归练习L
- 九度OJ 题目1083:特殊乘法
- 二分图最大匹配
- nginx 出现413 Request Entity Too Large
- first、follow、select集合求法及LL1文法判别
- 递推递归练习--M(数值分解)
- Twitter Lite以及大规模的高性能React渐进式网络应用
- LintCode 29 交叉字符串
- 【error】VS2010 LINK1123: failure during conversion to COFF: file invalid or corrupt
- 调停者模式(Mediator Pattern,对象行为型模式,中介者模式)
- android自适应屏幕
- 浙大校赛 ZOJ 3956Course Selection System (01背包)
- nginx架构(三)Nginx服务器的代理服务