精华内容
下载资源
问答
  • 输入任意的上下文无关文法,输出所输入的上下文无关文法一切非终结符的first集合和follow集合 输入任意的上下文无关文法,输出所输入的上下文无关文法一切非终结符的first集合和follow集合
  • 编译原理求FIRST集合FOLLOW集,超简单

    千次阅读 多人点赞 2020-12-03 19:16:13
    谁的FIRST集,要找谁在左侧的产生式,拿书上的例子来说(编译原理,陈火旺,第三版) E->TE' E'->+TE'|@ T->FT' T'->*FT'|@ F->(E)|i 然后要看产生式右侧, 1、若产生式右侧以终结符开头,就把这...

    看了好多求FIRST集和FOLLOW集的方法,这里是自己总结的,也是认为最实用的办法

    FIRST集

    求谁的FIRST集,要找谁在左侧的产生式,拿书上的例子来说(编译原理,陈火旺,第三版),其中@为空的意思

    E->TE'
    E'->+TE'|@
    T->FT'
    T'->*FT'|@
    F->(E)|i
    

    然后要看产生式右侧,
    1、若产生式右侧以终结符开头,就把这个终结符放入X的FIRST集中
    比如:F->(E)|i
    因为“(”和“i”都为终结符,所以FIRST(F)={(,i}。
    同理FIRST(E’)={+,@},FIRST(T’)={*,@}。
    2、若产生式右侧以其他非终结符开头(X->YZ),就把这个非终结符(Y)的FIRST集放入X的FIRST集中,如果Y的FIRST集中有空,就把它下一个非终结符(Z)的FIRST集放入X的FIRST集中,循环直到终结符或结束。
    比如:E->TE’和T->FT’,先说第一个,
    由于E->TE’,所以我们要把FIRST(T)放入FIRST(E)中,由于FIRST(T)不知道,所以先去求FIRST(T)。
    由于T->FT’,所以我们要把FIRST(F)放入FIRST(T)中,所以FIRST(T)={(,i},所以FIRSTt(E)={(,i}。

    FOLLOW集

    求谁的FOLLOW集,要找谁在右侧的产生式,还是这个例子

    E->TE'
    E'->+TE'|@
    T->FT'
    T'->*FT'|@
    F->(E)|i
    

    1、若X为文法的开始符号,那么#属于FOLLOW(X)。
    2、其实所有产生式都可以看做是E->yXz形式,其中X为所求非终结符,y、z可以是终结符,可以是非终结符,也可以是空。
    3、把FIRST(z)的非空元素加入FOLLOW(X)中。
    4、如果z->空或z为空,就把FOLLOW(E)加入到FOLLOW(X)中
    5、重复上述步骤至FOLLOW集不在增大
    6、FOLLOW集中没有@,遇到@请自动忽略
    (1)比如先求FOLLOW(E),发现在产生式F->(E)|i中可求,且E为文法开始符号,所以FOLLOW(E)=FIRST())={),#}。
    (2)求FOLLOW(E’),发现在产生式E->TE’ 和E’->+TE’|@中可求,由E->TE’可得FOLLOW(E’)包含FOLLOW(E),由E’->+TE’|@可得FOLLOW(E’)包含FOLLOW(E’),所以FOLLOW(E’)={),#}。
    (3)求FOLLOW(T),由产生式E->TE’和E’->+TE’|@得,FOLLOW(T)包含FIRST(E’),由产生式E’->+TE’|@可知E’->@,所以FOLLOW(T)包含FOLLOW(E’),所以FOLLOW(T)={+,),#}。
    (4)求FOLLOW(T’),由产生式T->FT’可得,FOLLOW(T’)包含FOLLOW(T),所以FOLLOW(T’)={+,),#}。
    (5)求FOLLOW(F),由产生式T->FT’可得,FOLLOW(F)包含FIRST(T’),由产生式T’->*FT’|@可知T’->@,所以FOLLOW(F)包含FOLLOW(T’),所以FOLLOW(F)={+,),#,*}。

    展开全文
  • 编译原理求first集合

    2013-07-23 08:59:24
    里面是编译原理课上所讲的求first的集合的源代码,使用C++编写的
  • 编译原理求FIRST集、FOLLOW集和SELECT集

    万次阅读 多人点赞 2019-07-02 15:29:50
    觉得解释比较不错。 所有大写字母代表非终结符,小写字母代表终结符,省略号代表未知数目(可能为0)的不确定类型的文法符号。 First集合: First集合顾名思义就是一个文法符号串所...求First集合可分如下几...

    转自:https://liuyanzhao.com/8279.html

    觉得解释比较不错。

    所有大写字母代表非终结符,小写字母代表终结符,省略号代表未知数目(可能为0)的不确定类型的文法符号。

    First集合:

    First集合顾名思义就是求一个文法符号串所可能推导出的符号串的第一个终结符的集合

    First(X)就是求X所有推导出的符号串的第一个符号的集合。

    求First集合可分如下几种情况:

    1、单个符号的First集合:单个终结符的First集合就是它自己。

    2、单个非终结符的First集合:

    A-->a… 产生式右部以终结符开头,根据定义,这种情况下显然可以看出a属于First(A)。

    A-->B… 产生式右部以非终结符开头,根据定义,既然可以把A替换成B……,也可以看出First(B)属于First(A)。这是一个递归的推导。

     

    3、多个符号形成的符号串的First结合:

    符号串ABC…,并且A不能推导出空串ε,显然根据定义First(ABC…)=First(A)

     

    符号串ABC…,并且A可能推导出空串ε,当A不是空串的时候,显然First(A)属于First(ABC…),但当A是空串的时候,ABC…就成了BC…,此时根据B是否能推出空串来决定是否将First(B)加入First (ABC…)。这是一个递归的推导,综上所述,符号串中的第一个不能推出空串的符 号前面所有符号的First集合减去空串ε都属于First(ABC…),第一个不能推出空串的 符号的First集合也属于First(ABC…)。也就是假设A、B都可以推出空串,C不能推 出空串,First(ABC…)=First(A)-ε∪First(B)-ε∪First(C)。

     

    注意:First集合中的符号一定是终结符,终结符也包括空串ε。

    A–>…UP… 要求的Follow集合的非终结符后跟非终结符

     

    Follow集合:

    Follow集合也是顾名思义的,就是文法符号后面可能跟随的终结符的集合(不包括空 串ε)

    Follow(X)就是求X后面可能跟随的符号集合。

    求Follow集合可分如下几种情况:

    终结符的Follow集合没有定义,只有非终结符才会有Follow集合。

     

     

    A–>…Ua… 要求的Follow集合的非终结符后跟终结符

    根据定义,显然a属于Follow(U)。这种情况下,Follow(U)和A没有任何关系,产 生式左边是什么无所谓。

     

    A–>…UP… 要求的Follow集合的非终结符后跟非终结符

    根据定义,显然P的第一个符号属于Follow(U),也就是First(P)属于Follow(U)。

     

    A–>…UP并且ε属于First(P) 要求的Follow集合的非终结符后跟非结尾的终结符, 并且结尾非终结符的First集合包含空串。

    这是上一种情况的一种特例,除了要按上一种情况处理,First(P)属于Follow(U) 以外还要进行分析;因为当P推导为空串时,空串不能出现在Follow集合中,所以U 后面跟随的应该是P后面的东西,可P已经是结束的符号,此时U后面显然就是A后 面跟随的东西了。所以在这种情况下Follow(A)也属于Follow(U)。

     

    A–>…U 要求的Follow集合的非终结符在产生式结尾

    这时候又要递归推导,U是A的结尾,所以U后面跟随的东西也就是A后面跟随的东 西。所以Follow(A)属于Follow(U)。

     

    注意:Follow集合中的符号一定是终结符,并且不能包括空串ε,而且定义开始符号 的Follow集合初始为{#(句子括号)}。

     

    Select集合:

    Select集合就是产生式左部的可能的推导结果的起始符号。

    Select(A–>B)就是求这个产生式中A可能推导出起始符号集合(不包含空串ε)。

    求Select集合可分如下几种情况:

    A–>X (X为任意文法符号串,不限于非终结符或单个符号),并且X不能推导出空串 ε

    根据定义,显然A推出的符号串起始就是X的起始,也就是First(X).

    Select(A–>X)= First(X)

    A–>X (X为任意文法符号串,不限于非终结符或单个符号),并且X能推导出空串ε

    根据定义,显然First(X)属于Select(A–>X),此外,当X推导为空串时,显然A 也推导为空串,那么此时推导出的符号串就会是A后面的符号的推导结果。也就是 Follow(A),所以,此时Follow(A)也属于Select(A–>X)。

    注意:Select集合中不包括空串ε,但有可能会包含#(句子括号)。

     

    举个例子:

    S→AB

    S→bC

    A→ε

    A→b

    B→ε

    B→aD

    C→AD

    C→b

    D→aS

    D→c

    求他的first,follow,select

    先求First集

    • First(S) =(First(A)-{ε})∪(First (B)-{ε}) ∪{ε}∪{b} ={a,b,ε}

    因为A的first有ε,B的first有ε,S->AB,所以是First(A)-{ε})∪(First (B)-{ε}) ∪{ε},然后S->bC,所以再加一个b,就是First(A)-{ε})∪(First (B)-{ε}) ∪{ε}∪{b},

    • First (A)={b, ε}

    没什么好解释的

    • First (B)={a, ε}

    ε不用解释,就是B->ε,所以有他,a就是因为B->aD,第一个非终结符是a所以有a,那要不要加上D的first呢,就是a和c,答案是不用,就只要aD里面的a就可以

    • First (C)={a,b,c}

    C->AD这一句,AD都是非终结符,所以要找A和D的first集,D的是a,c,A的是b,ε,因为不是AD同时都能推出ε所以C的first是A和D的first的并集减去ε,还要加上b,因为有C->b这一句

    • First (D)={a,c}

    D->c不用解释,D->aS这一句,不用加上S的first!!!

     

    First (AB)={a,b,ε}

    First (bB)={b}

    First (ε)={ε}

    First (b)={b}

    First (aD)={a}

    First (AD)={a,b,c}

    First (aS)={a}

    First (c)={c}

    AB同时能够推出ε,所以first(AB)就是A和B的first的并集减去ε再并上ε

    bB的first就是b,不用加上B的first

    ε的就是ε,b就是b,c就是c,只有一个终结符ε没什么好说的

    一个终结符和一个非终结符的,就要那个终结符就可以,不用管后面那个非终结符,

    两个非终结符的要看是不是他们两个同时能推出ε,能就有ε,要是有一个不能推出ε,那first集就没有ε

    AB有ε是因为AB都能推出ε,AD没有是因为A能D不能推出ε

    以上first集就求完了,是不是很简单,我搞了一上午。。。

     

    接下来求follow集

    从开始符号S开始推倒,开始符号的follow里面一定要有#,

    所以开始符号的S的follow集要有#,

    follow是找->后面的,比如找S的follow,就要看谁的->后面有S,D->aS里面有S,然后在看D->aS的S后面有没有别的符号,没有就加上D的follow集,如果有,就加上后面那个字母的first集里面除了ε以外的符号,在看这个字母能不能推出ε,如果能,就再加上->左边的那个字母的follow

    看A的follow,首先找所有->后面有A的,找到了S->AB,C->AD,先看S->AB,A后面有B,所以要加上B的first集里面除了ε的其他符号,再看B能不能在有限的步骤里推出ε,有B->ε这句,所以能,就要再加上->左边的S的follow集,所以目前的A的follow集里面有a,和follow(S),再看C->AD这一句,A后面有D,所以要加上D的first集里面除了ε的其他的,再看B能不能在有限的步骤里推出ε,D不能,所以不用加->左边的C的follow,所以A的follow就是a,follow(S),a,c,但是如果有重复的,就只要一个,所以最终就是a,c,follow(S),这个follow(S)到后面还要算出来的,不能就这样写

    看B的follow,找所有->后面有B的,找到了S->AB,看B后面有字母吗?没有,就加上->左边的S的follow,所以follow(B)=follow(S)

    看C的follow,找所有->后面有C的,找到了S-bC,看C后面有字母吗?没有,就加上->左边的S的follow集,所以follow(C)=follow(S)

    看D的follow,找所有->后面有D的,找到了B->aD。C->AD,这两句D后面都没有字母,所以加上->左边的B和C的follow,所以follow(D)=follow(B)并上follow(C)

    最终要把以上的follow都求出来,看

    follow(S)=#+follow(D),

    follow(D)=follow(B)+follow(C),

    所以follow(S)=#+follow(B)+follow(C),

    follow(B)=follow(S),

    follow(C)=follow(S)

    所以follow(S)=#+follow(S)+follow(S),

    所以follow(S)就是#,

    follow(B),follow(C),follow(D)也都是#,

    所以follow(A)就是ac,#,求完了,以上所有的+代表求并集

     

    再看select怎么求

    对于A->a,

    如果a≠>ε,那么select(A->a)=first(a),

    如果a=*>,那么select(A->a)就是first(a)-ε+follow(A)

    看select(S->AB),AB都能推出ε,所以select(S->AB)=first(AB)-ε+follow(S)所以结果是a,b,#

    看select(S->bC),bC不能推出ε,所以是first(bC),结果是b

    看select(A->ε),A能推出ε所以是first(ε)-ε+follow(A)结果a,c,#

    看select(A->b),这里的A是推出b不是ε所以是first(b),结果是b

    看select(B->ε),B能推出ε,所以是first(ε)-ε+follow(B),结果是#

    看select(B->aD),这里B不能推出ε,所以是first(aD),结果是a

    看select(C->AD),这里D不能推出ε,所以算AD不能推出ε,就是first(AD),结果是a,b,c

    看select(C->b),C推不出看ε,所以是first(b),结果是b

    看select(D->aS),这里不能推出ε,所以是first(aS),结果是a

    看select(D->c),这里D不能推出ε,所以是first(c),结果是c

    LL(1)文法

    是自顶向下分析,从左到右扫描输入串,最左推导,只需向右看一个符号就可以决定如何推倒

    LL(1)文法满足条件:左部相同的产生式的select集的交集为空,并且产生式的右部不能同时推导出ε,那么这个文法是LL(1)文法,否则不是

    上面的文法select(C->AD)和select(C->b)的交集是b不是空,select(S->AB)和select(S->bC)的交集也是b不是空,所以这不是一个LL(1)文法

    展开全文
  • 编译原理 求first集与follow集 c++ 题目: 输入任意的上下文无关文法,输出所输入的上下文无关文法一切非终结符的first集合和follow集合
  • 语言为C++,使用了set,map容器,输入格式:S -> Aa | g | e,支持多‘|’ 符号,采用文件输入
  • ( 编译原理JAVA求First集Follow集
  • 编译原理上机,C++实现产生式的firstfollow集合,内含注释,按照文字类的求解方法转换成代码,清晰易懂。
  • 编译原理求FIRST

    2019-05-13 23:46:26
    Vt是终结符集,Vn是非终结符集,P为产生式集,S为开始的非终结符。(书上一般大写的是非终结...FIRST(a)={a|a=>*ab,a∈VT, a,b∈V*} 若a=>*ε则规定ε∈FIRST (a)。称FIRST(a)为a的开始符号集或首符号集。 ...

    Vt是终结符集,Vn是非终结符集,P为产生式集,S为开始的非终结符。(书上一般大写的是非终结符,小写是终结符

    以下的定义可直接不看,书上太抽象,又啰嗦,直接看红字。

    定义:设G=(Vt,Vn,P,S)是上下文无关文法。

    FIRST(a)={a|a=>*ab,a∈VT, a,b∈V*}

    若a=>*ε则规定ε∈FIRST (a)。称FIRST(a)为a的开始符号集或首符号集。

    First(a)集就是求从a出发推导出所有开头的 终结符 构成的集合。

    S => aB     B => b     那么First(S)  = {a};因为B只能推出终结符 b ,S => ab,所以它的首个开始符号为{a}

    考虑以下情况,

    S => AB

    A => a

    A => ε

    B => b

    b => ε      那么此时First(S) = {a,b,ε},因为A有可能推出 {a,ε} ,当推出ε时,导致 S => B,此时B又可以推出 {b,ε} ,所以最终

    First(S) = {a,b,ε}


     正式计算First集的语言描述如下:

     

    1. 若 X∈Vt,则FIRST(X)={X}。
    2. 若X∈Vn,且有产生式 X→a……(a∈Vt),则 a ∈ First(X)。
    3. 若X∈Vn,X => ε ,则 ε ∈ First(X)。
    4. 设G中有形如X→Y1…Yk的产生式,其中 X,Y1…Yk∈Vn,且 Y1…Yi-1 均能 =>*ε(1≤i≤k),则FIRST(Y1)-{ε},…, FIRST(Yi-1)-{ε},FIRST(Yi) 都包含在FIRST(X)中。
    5. 若对一切1≤i≤k,均有ε∈FIRST(Yi),则将ε符号加进FIRST(X)。

    简单来说,

    (1)如果是求的是终结符的First的集,那结果就是它本身;

    (2)如果求非终结符的First集,就看它的产生式的首个符号是不是终结符,

            (2.1)如果是该符号就是所求First集的一员;

            (2.2)如果不是,那它就是非终结符,记为K,递归(2)重复上述步骤(非终结符推出空串的情况先不考虑);

    (3)如果(2)中的 K 能推出 ε ,那么 ε 也要加入First集中。

     

     

    展开全文
  • 编译原理之NULL集、first、follow集C语言实现,实现中句子的转换符号由‘#’代替,数组默认由‘*’作为结束符
  • 编译原理FIRST集和FOLLOW集的

    千次阅读 多人点赞 2019-06-18 17:16:41
    编译原理FIRST集和FOLLOW集的法 由于最近要期末考试了,所以要从头到尾复习(预习)一遍了。陈意云老师写的课本比较抽象,看不太懂,最后又找了中科大的编译原理课,可能听的时候太困了没有集中精力,又跑去看了...

    编译原理FIRST集和FOLLOW集的求法

    由于最近要期末考试了,所以要从头到尾复习(预习)一遍了。陈意云老师写的课本比较抽象,看不太懂,最后又找了中科大的编译原理课,可能听的时候太困了没有集中精力,又跑去看了以前曾经看过的哈工大的公开课,应该是看懂了,所以就厚颜无耻的来捋一捋,欢迎交流,批评指正。

    废话不多说,直接看怎么计算的吧。
    首先看FIRST集,文字描述如下:

    1.FIRST(X):可以从X推导出的所有串首终结符构成的集合
    如果X=>*ε,那么ε∈FIRST(X)

    举个栗子

    表达式FIRST集FOLLOW集
    E -> TE’{}{}
    E’-> +TE’|ε{}{}
    T-> FT’{}{}
    T’->*FT’|ε{}{}
    F-> (E)|id{}{}

    我是这样做的,首先看有终结符的表达式F-> (E)|id可以得到FIRST(F)={(, id};
    再看有终结符的表达式T’->FT’|ε,得到FIRST(T’)={*, ε}
    再看E’-> +TE’|ε,得到FIRST(E’)={+ , ε},所得得到以下结果:

    表达式FIRST集FOLLOW集
    E -> TE’{}{}
    E’-> +TE’|εFIRST(E’)={+ , ε}{}
    T-> FT’{}{}
    T’->*FT’|εFIRST(T’)={*, ε}{}
    F-> (E)|idFIRST(F)={(, id}{}

    然后再从头看每个表达式可以得到FIRST(E)=FIRST(T),所以去求FIRST(T);
    所以来看表达式T-> FT’,得到FIRST(T)=FIRST(F),又因为F无法推导出ε,所以FIRST(T)=FIRST(F);
    同理可得FIRST(E)=FIRST(T)=FIRST(F)
    所以表就更新为以下结果:

    表达式FIRST集FOLLOW集
    E -> TE’FIRST(E)={(, id}{}
    E’-> +TE’|εFIRST(E’)={+ , ε}{}
    T-> FT’FIRST(T)={(, id}{}
    T’->*FT’|εFIRST(T’)={*, ε}{}
    F-> (E)|idFIRST(F)={(, id}{}

    这时候,我们FIRST集就已经求完了,接下来看FOLLOW集:
    同样先来文字描述:

    FOLLOW(A):可能在某个句型中紧跟在A后边的终结符a的集合
    FOLLOW(A)={a| S=>*αAaβ, a∈VT, α,β∈(VT∪VN)*
    如果A是某个句型的最右符号,则将结束符“$”添加到FOLLOW(A)中。

    还是上面的栗子:

    表达式FIRST集FOLLOW集
    E -> TE’FIRST(E)={(, id}{}
    E’-> +TE’|εFIRST(E’)={+ , ε}{}
    T-> FT’FIRST(T)={(, id}{}
    T’->*FT’|εFIRST(T’)={*, ε}{}
    F-> (E)|idFIRST(F)={(, id}{}

    我是首先找处在句子最右边的非终结符有哪些,由上面的表达式可以看出,分别有E’、T’所以首先把"$"填进去:

    表达式FIRST集FOLLOW集
    E -> TE’FIRST(E)={(, id}{}
    E’-> +TE’|εFIRST(E’)={+ , ε}FOLLOW(E’)={$}
    T-> FT’FIRST(T)={(, id}{}
    T’->*FT’|εFIRST(T’)={*, ε}FOLLOW(T’)={$}
    F-> (E)|idFIRST(F)={(, id}{}

    然后从头开始看,首先看E,先直观的看E后面跟有哪些终结符;很容易可以看到有“)”;
    又因为E为开始符号,所以FOLLOW(E)中有“$”符
    再看T,T后面跟的是E’,所以FOLLW(T)要包含FIRST(E’);又由于E’可以推导出空串,所以T也可以是最右符号;
    再看T’,T’首先是最右符号,所以FOLLOW(T)包含结束符;
    最后看F,F后面跟的是T’,所以FOLLOW(F)包含FIRST(T’),又由于T’可以推导出空串,所以F也可以是最右符号
    所以得到以下列表:

    表达式FIRST集FOLLOW集
    E -> TE’FIRST(E)={(, id}FOLLOW(E)={), $}
    E’-> +TE’|εFIRST(E’)={+ , ε}FOLLOW(E’)={$}
    T-> FT’FIRST(T)={(, id}FOLLOW(T)={+, $}
    T’->*FT’|εFIRST(T’)={*, ε}FOLLOW(T’)={$}
    F-> (E)|idFIRST(F)={(, id}FOLLOW(F)={*, $}

    接下来再看有表达式推导得到的FOLLOW集是否发生改变:
    又由于E->TE’,所以FOLLOW(E)=FOLLOW(E’);
    又因为T->FT’,所以FOLLOW(T)=FOLLOW(T’)
    所以有些FOLLOW集需要更新如下所示:

    表达式FIRST集FOLLOW集
    E -> TE’FIRST(E)={(, id}FOLLOW(E)={), $}
    E’-> +TE’|εFIRST(E’)={+ , ε}FOLLOW(E’)={$, )}
    T-> FT’FIRST(T)={(, id}FOLLOW(T)={+, $}
    T’->*FT’|εFIRST(T’)={*, ε}FOLLOW(T’)={$, +}
    F-> (E)|idFIRST(F)={(, id}FOLLOW(F)={*, $}

    再看有些表达式能够推出空串,所以右边非终结符的FOLLW集合需包含左边非终结符的FOLLW集合,如E -> TE’,由于E’能够推导出空串,所以FOLLW(T)要包含FOLLW(E),根据这条规则,对FOLLW集做以下更新:

    表达式FIRST集FOLLOW集
    E -> TE’FIRST(E)={(, id}FOLLOW(E)={), $}
    E’-> +TE’|εFIRST(E’)={+ , ε}FOLLOW(E’)={$, )}
    T-> FT’FIRST(T)={(, id}FOLLOW(T)={+, $, )}
    T’->*FT’|εFIRST(T’)={*, ε}FOLLOW(T’)={$, +, )}
    F-> (E)|idFIRST(F)={(, id}FOLLOW(F)={*, $, +,)}

    总结

    FIRST集没什么问题,很好求,但是FOLLOW集合想对就比较麻烦,需要考虑的地方比较多,在做题目的时候千万不要遗漏!
    欢迎批评指正,交流。

    展开全文
  • 编译原理课程设计。。。。简单的FIRST集FOLLOW集求解的程序。。。。压缩文档中ffs.cpp为源程序。。。。使用了bool。。。。所以做了cpp。。。。Production文本是供程序使用的产生式。。。。其余的是过程文件。。。。...
  • S→ABS→bCA→εA→bB→εB→aDC→ADC→bD→aSD→c他的first,follow,selectFirst(S) =(First(A)-{ε})∪(First (B)-{ε}) ∪{ε}∪{b} ={a,b,ε}因为A的first有ε,B的first有ε,S->AB,所以是First(A)-{...
  • 下面是这部分的代码,我贴一部分,剩下的等我把follow集实现再写一篇博文来给大家看! 请给我点赞谢谢~!!! 实现得非常简洁明了(自夸) 你可以看下注释,写的非常清楚啦!!! package parse2; import java.u...
  • 编译原理------C++实现求First集和Follow集

    千次阅读 多人点赞 2019-12-06 20:39:54
    First集算法描述 1.若X->a…,则将终结符a放入First(X)中 2.若X->ε,则将ε放入First(X)中 3.若有X->Y1Y2Y3…Yk,则 (1)把First(Y1)去掉 ε后加入First(X) (2)如果First(Y1)包含ε,则...
  • 编译原理FIRST集和FOLLOW集的法以及构建LL(1)分析表

    万次阅读 多人点赞 2019-07-01 10:57:57
    文章目录FIRST集的法FOLLOW集的计算生成预期分析表算法例题 FIRST集的FIRST集是一个文法符号串所可能推导出的符号串的第一个终结符的集合 对于文法G的任一符号串α\alphaα = x1x2…xnx_{1}x_{2} \ldots x_{n...
  • 博文链接:https://zpchen.iteye.com/blog/208947
  • 最近在学习微机原理,里面涉及到编译优化的问题,又去重新看了看龙书的语法分析部分。之前学习的时候只是知道first和follow集合怎么计算,但是没有很明白背后的原理。想起轮子哥的一句话:要理解一个东西最好的办法...
  • 编译原理first和follow的计算方法

    千次阅读 多人点赞 2019-12-14 17:40:13
    概括下来,计算的时候,first看产生式的左部,follow看产生式的右部。还是用书上的例子好了: E —> TE' E'-> +TE'|ε T -> FT' T'-> *FT'|ε F -> (E)|id 可能会看得不那么清楚。拆开来看好了: E ...
  • 技术还不是很成熟,希望大家不要嫌弃!程序是由java编写的,是看了以为前辈的程序有感而写的,也是为了交作业被逼的,呵呵!
  • C语音代码。实现功能:1....2.每个非终结符FIRST 集FOLLOW集和SELECT集模块。3.预测分析表的构建模块。4.文法的检验及消除左公因子和左递归模块。5.对输入终结符串的判断,是否为LL1文法,并进一步分析。
  • 编译原理 求解first集和follow集步骤(附例子)

    万次阅读 多人点赞 2020-03-14 21:07:41
    First集 定义:对于任意文法符号串α ,FIRST(α)是可从α推导得到的串的首符号的集合 如果αε,则ε也在FIRST(α)中( 即α可空) FIRST(α)={t|α-->...tβ,求FIRST(α) ①如果首符号t...
  • 我的理解:对于一个X,X的FIRST集合,就是在X 能够推导出来的 式子中的第一个终结符的集合。特殊情况:若X只能推出ε,那么就将ε加入FIRST集合 举例说明: 思路:FIRST集合可以按照 从下往上 的方法依次出。 &...
  • 编译原理FIRST集FOLLOW集

    万次阅读 多人点赞 2017-12-01 17:22:29
    编译原理 FIRST,FOLLOW集的
  • 编译原理及实现——计算FIRST集 你好! 第一次在CSDN上发文章,如有不足之处还望包涵。 下面开始介绍计算方法。 在计算之前先了解FIRST集的定义和算法 定义: FIRST(α)={a|a-->aβ,a∈Vt,α,β∈V }若a-*->...
  • First集和Follow集的
  • 编译原理之计算FIRST集合和FOLLOW集合

    万次阅读 多人点赞 2018-04-11 13:24:00
    FIRST集合的求解规则 计算各个文法符号X的FIRST(X)时,不断应用下列规则,直到再没有新的终结符号或者ε可以被加入到任何FIRST集合中为止。 如果X是一个终结符号,那么FIRST(X) = X。 如果X是一个非终结符号...
  • 编译原理FIRST集合和FOLLOW集合

    千次阅读 多人点赞 2020-06-07 05:03:28
    FIRST集合 定义:可从α推导得到的串的首符号的集合,其中α是任意的文法符号串。 规则:计算文法符号 X 的 FIRST(X),不断运用以下规则直到没有新终结符号或 ε可以被加入为止 : (1)如果 X 是一个终结符号...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,915
精华内容 22,766
关键字:

编译原理求first