(转)混乱的First、Follow、Firstvt和Lastvt

转自: http://dongtq2010.blog.163.com/blog/static/1750224812011520113332714/

学编译原理的时候,印象最深的莫过于这四个集合了,而且也十分为之纠结。
首先要知道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

时间: 2024-08-07 00:17:12

(转)混乱的First、Follow、Firstvt和Lastvt的相关文章

编译原理——算符优先分析文法(附源代码)

算符优先分析文法 一.写在前面 算符优先分析文法是一种工具,在编译的过程中,隶属于语法分析环节,却又与中间代码的生成息息相关,编译可以分为五个阶段:词法分析.语法分析.语义分析(中间代码的生成).代码优化.目标代码生成.语法分析是指:在词法分析基础上,将单词符号串转化为语法单位(语法范畴)(短语.子句.句子.程序段.程序),并确定整个输入串是否构成语法上正确的程序.也就是说语法分析是检验输入串的语法是否正确,注意这里的语法正确,只是简单地符合自己定义的规范,而不能检测出运行时错误,比如"X/0&

编译原理-算符优先

/* *功能:算符优先 *作者:王文堃 *创建时间:2016/5/15 */ #include <iostream> #include <malloc.h> #include <stack> using namespace std; /* *任务一:构造FIRSTVT,LASTVT *任务开始时间:2016/5/15 *任务结束时间:2016/5/16 */ /* *任务二:构造算符优先表 *任务开始时间:2016/5/17 *任务完成时间:2016/5/17 */ /

软考路上——编译原理

编译原理在软考中的考点大体上分为以下几点:文法.语法推倒树和算符优先 下面就从这三方面来总结一下. 文法 基本元素 首先要了解文法中最基本的两个元素:非终结符和终结符. 非终结符可以理解为还可以拆分的元素,一般用大写字母来表示:终结符当然就可以看做是不可以拆分的元素,终结符不能转换为其他状态,也不能用其他的量来代替,一般用小写字母来表示. 在图中可以看到,一个文法G是由VN,VT,P,S组成的四元组,其中:VN代表非终结符的集合:VT代表终结符的集合:P是一个规则[α→β,α∈(VN∪VT)且α

自下而上语法分析

1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程. 答: # i+i*i# 移进 #i +i*i# 归约 #F +i*i# 归约 #T +i*i# 归约 #E +i*i# 移进 #E+ i*i# 移进 #E+i *i# 移进 #E+F *i# 归约 #E+T *i# 归约 #E+T* i# 移进 #E+T*i # 归约 #E+T*F # 归约 #E+T # 归约 #E #   2.P121

13自下而上语法分析

1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程. 符号栈 输入串 动作 # i+i*i# 移进 #i +i*i# 归约 #F +i*i# 归约 #T +i*i# 归约 #E +i*i# 移进 #E+ i*i# 移进 #E+i *i# 移进 #E+F *i# 归约 #E+T *i# 归约 #E+T* i# 移进 #E+T*i # 归约 #E+T*F # 归约 #E+T # 归约 #E #

12.4自下而上语法分析

1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程. 符号栈 输入串 动作 # i+i*i# 移进 #i +i*i# 归约 #F +i*i# 归约 #T +i*i# 归约 #E +i*i# 移进 #E+ i*i# 移进 #E+i *i# 归约 #E+F *i# 归约 #E+T *i# 移进 #E+T* i# 移进 #E+T*i # 归约 #E+T*F # 归约 #E+T # 归约 #E #

12.11算符优先分析

1. 已知算符优先关系矩阵如下表: + * i ( ) # + > < < < > > * > > < < > > i > > > > ( < < < < = ) > > > > # < < < < = 写出符号串(i+i)*i#的算符优先分析过程. 答: 栈 关系 输入串 操作 # < ( i + i ) * I # 移进 #( &

编译原理之算符优先分析

1. 已知算符优先关系矩阵如下表:   + * i ( ) # + > < < < > > * > > < < > > i > >     > > ( < < < < =   ) > >     > > # < < < <   =  写出符号串(i+i)*i#的算符优先分析过程. 2.接上个文章两个步骤. 1)计算FIRSTVT和 LAST

软件构造——实验五 算符优先分析法

[实验目的] 掌握算符优先分析法的原理,利用算符优先分析法将赋值语句进行语法分析. [实验内容] (1)输入一个文法根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否为算符优先文法 (2)输入一个句子进行分析 [实验要求] 1.根据文法求FIRSTVT集和LASTVT集 给定一个上下文无关文法,根据算法设计一个程序,求文法中每个非终结符的FirstVT 集和LastVT 集. 可参考算法描述如下: /*求 FirstVT 集的算法*/ PROCEDURE insert(P,a); IF