FIRST集和FOLLOW集,FIRSTVT集和LASTVT集的求法
学习编译原理时, 这几个集合相信大家并不陌生:FIRST、FOLLOW、FIRSTVT、LASTVT。
其中First和Follow是一对,而Firstvt和Lastvt是一对。
它们的作用分别是:
- First和Follow是为了画预测分析表的(在LL(1)分析法处);
- Firstvt和Lastvt是为了画算符优先关系表的(就是表里面填优先大于小于等于的那个)。
并且它们都是 终结符 的集合。
这里主要讲它们如何构建的问题:
先说First和Follow
First
如A->aB | CD
这里面包含了组成First(A)的两种情况:
以终结符开头, 当然要把这个终结符放到A的First里
以非终结符开头, 先把C的First放到A的First里
再看如果C的First中有空的话就把D的First放到A的First里,如果D也有空的话往后依次类推
技巧:First一般从下往上找。
如果要找A的First,我们要找A的定义式,即A在左边的式子,看着他的右边来找。
Follow
如S->(L) | aL | LC
找Follow的三种情况:先在候选式(右边)中找到该非终结符,如L(注意例中只有一个定义,但找Follow要看到所有右边出现该非终结符的)
如果L的右边是终结符, 那么这个终结符加入L的Follow
如果L的右边是非终结符, 那么把这个非终结符的First除去空加到L的Follow中
如果L处在末尾, 那么,'->'左边符号的Follow成为L的Follow
另外要注意的是:
开始符号的Follow中要加上‘#’
技巧:Follow一般从上往下找。
如果要找L的Follow,要从式子的右边找到L,然后来找L的Follow,这与First是不同的。
下面再介绍Firstvt和Lastvt
Firstvt
找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:
A->a.......,即以终结符开头,该终结符入Firstvt
A->B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt
A->Ba.....,即先以非终结符开头,紧跟终结符,则终结符入Firstvt
Lastvt
找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:
A->.......a,即以终结符结尾,该终结符入Lastvt
A->.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt
A->.....aB,即先以非终结符结尾,前面是终结符,则终结符入Lastvt
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决