FIRSTVT和LASTVT的计算(很长但是很详细)

目录

1.定义

2.定义剖析与理解

(1)FIRSTVT(P)

(2)LASTVT(P)

3.例题演示

 (1)FIRSTVT的详细计算过程

1.第一遍扫描

2.第二遍扫描

3.第三遍扫描 

4.第四遍扫描 

5.第五遍扫描

(2)LASTVT的详细计算过程 


 

1.定义

 

大家看完定义之后是不是觉得有点懵,这很正常,我们要利用定义做题的第一步就是理解定义。

笔者在这里先给大家抛个引子,我认为它们的计算与FOLLOW集的计算有类似之处(FOLLOW集的计算我在之前的文章里详细介绍过)

2.定义剖析与理解

 

大家看看这样是不是比上面的定义要好理解的多,其实这就是我们解决问题的思路与过程。

如果大家觉得还不够通俗易懂,我再用白话文来解释一下,可能不够严谨,但却非常容易理解。 

(1)FIRSTVT(P)

第一步:从第一个推导式开始找,有没有以终结符开头(a...)或者以一个非终结符加上一个终结符开头(Qa...)的表达式,有的话将FIRSTVT(a)中所有的元素加到FIRSTVT(P)中去。

第二步:如果FIRSTVT(a)中所有元素都在FIRSTVT(Q)中,并且P可以推导出以Q开头的表达式,则将FIRSTVT(a)中所有元素放入FIRSTVT(P)中去。

(2)LASTVT(P)

和上面的推导过程是一样的,同学们模仿上面的进行推导。

3.例题演示

 (1)FIRSTVT的详细计算过程

1.第一遍扫描

首先分析E->E+T,进行第一步可知符合以一个非终结符加上一个终结符开头(Qa...),将+加入到FIRSTVT(E)中。

再分析第二步,可知E->E+T还符合P->Q,FIRSTVT(E)中的元素加入到FIRSTVT(E)中,集合不发生变化。

E的第二个候选E->T经过分析也符合P->Q,FIRSTVT(T)中的元素加到FIRSTVT(E)中,此时FIRSTVT(T)为空,集合不发生变化。

第二个候选式和第三个候选式的推导过程和第一个基本是一模一样的思路,我把过程推导出来的表格附在上面,同学们动手推导以后再对答案。

 

 

最后一个候选式比较特殊,我再来手工推导一遍。我们先来看第一个式子P->(E) |i,同样可以知道以终结符开头(a...)符合第一步,将(和i放FIRSTVT(P),接着看,他们并不符合第二步。

 第一遍结束,集合发生了变动,接着进行第二遍。

2.第二遍扫描

直接上推导图

 

 

第二遍推导结束,集合发生变化,进行第三遍推导。

3.第三遍扫描 

 

第三遍扫描结束,集合有变化,开始第四遍推导。

4.第四遍扫描 

 第四遍扫描结束,集合有变化,开始第五遍推导。

5.第五遍扫描

集合没有发生变化,推导结束。

(2)LASTVT的详细计算过程 

其实和FIRSTVT是类似的,同学们按照前面的思路自行推导。

  • 36
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: FirstVTLastVT是编译原理中的两个重要的集合,用于分析和构建语法分析器。 FirstVT集合指的是给定文法符号(终结符或非终结符)能够推导出的所有可能的终结符的集合。例如,对于一个文法符号A,它的FirstVT集合是由A所在的产生式右侧的第一个文法符号的FirstVT集合加上终结符ε(如果A能够推导出ε的话)。 LastVT集合指的是给定文法符号(终结符或非终结符)能够在产生式右侧出现的最后一个位置,推导出的所有可能的终结符的集合。例如,对于一个文法符号A,它的LastVT集合是由A所在的产生式右侧的最后一个文法符号的LastVT集合加上终结符ε(如果A能够推导出ε的话)。 FirstVTLastVT集合在语法分析器的构建和优化中都有广泛的应用。例如,在LL语法分析器中,可以使用FirstVT集合来预测产生式右侧的第一个符号,而使用LastVT集合则可以优化语法分析器的执行效率。 ### 回答2: 编译原理中的firstvtlastvt是两个非常重要的概念,它们用于描述文法中每个非终结符号所能产生的字符串中的首个和最后一个终结符号。 首先,让我们简要介绍一下文法。文法是用于定义编程语言语法结构的形式化表示方式,由一个有限的终结符集合和一个有限的非终结符集合组成。非终结符表示语言中的语法结构,终结符表示语言中的实际内容,例如数字、关键字、运算符等。 在文法中,一个非终结符能够产生的终结符号序列就是该非终结符的firstvt集合。而一个非终结符能够产生某个终结符号的序列的最后一个终结符就是该非终结符的lastvt集合。 计算firstvt集合的方法是:首先将该非终结符能够直接推导出来的终结符号加入到其firstvt集合中,如果该非终结符能够推导出一个或多个产生空串的非终结符,则继续将这些非终结符的firstvt集合中的终结符号也加入到该非终结符的firstvt集合中。直到其firstvt集合不再发生任何变化为止。 计算lastvt集合的方法是:首先将该非终结符能够直接推导出来的终结符号加入到其lastvt集合中,如果该非终结符能够推导出一个或多个产生空串的非终结符,则继续将这些非终结符的lastvt集合中的终结符号也加入到该非终结符的lastvt集合中。直到其lastvt集合不再发生任何变化为止。 在编译原理中,firstvtlastvt集合经常用于计算运算符优先级和执行语句的顺序等方面。它们不仅可以帮助程序员分析语法结构,更可以提高程序的运行效率和降低程序错误率。 ### 回答3: 编译原理中,FirstVTLastVT是词法分析中的两种关键算法。它们用于计算文法中每个非终结符的“第一个终结符集合”和“最后一个终结符集合”,这些终结符集合通常用于语法分析器中。 FirstVT(First Value Table)和LastVT(Last Value Table)都是一个集合,它们描述了一个非终结符能够产生的(或可以推导出来的)第一个或最后一个终结符。 在计算FirstVTLastVT时,需要遍历整个文法规则集合,统计每个非终结符的FirstVTLastVT集合。 计算FirstVT时,需要遵循以下步骤: 1. 将所有非终结符的FirstVT初始化为空集。 2. 将终结符对应的单个字符作为它本身的FirstVT,将ε作为所有ε产生式的FirstVT,将文法规则中出现的所有ε作为FirstVT为空集的非终结符的FirstVT。 3. 依次计算文法规则右部的字符对应的非终结符的FirstVT。如果是终结符,则添加到左侧非终结符的FirstVT中;如果是非终结符,则将该非终结符的FirstVT添加到左侧非终结符的FirstVT中,直到右侧字符不为ε为止。 计算LastVT时需要遵循类似的步骤: 1. 将所有非终结符的LastVT初始化为空集。 2. 将终结符对应的单个字符作为它本身的LastVT,将ε作为所有ε产生式的LastVT,将文法规则中出现的所有ε作为LastVT为空集的非终结符的LastVT。 3. 依次计算文法规则右部最后一个字符对应的非终结符的LastVT。如果是终结符,则添加到左侧非终结符的LastVT中;如果是非终结符,则将该非终结符的LastVT添加到左侧非终结符的LastVT中,直到右侧字符不为ε为止。 在语法分析中,可以使用FirstVTLastVT集合,来执行FOLLOW集的计算和LL(1)分析表的构建。例如,对于文法规则A-> BC,求B的Follow集,可以使用C的FirstVT或A的Follow集。而在LL(1)分析表中,可根据文法规则的左部和右部的FirstVT和Follow集合来填写表格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值