Skip to content

编译原理基础

文法与语言描述

二型文法式子左边必须是非终结符,式子右边可以有多个字符。

给出生成下述语言的上下文无关文法(II 型):

L(G)={anbnambm|n,m0}

G(S):S\rarrAAA\rarraAb|ϵ

三型文法式子左边只能有一个字符,而且必须是非终结符;式子右边最多有两个字符。如果有两个字符必须是终结符 + 非终结符的格式,如果是一个字符,那么必须是终结符。

给出生成下述语言的正规文法(III 型):

L(G)={anbm|n,m1}

G(S):S\rarraA|bBA\rarraA|bB|ϵB\rarrbB|ϵ

文法 G(S):S\rarrdABA\rarraA|ϵB\rarrBb|ϵ 描述的语言 L(G) 是什么?

L(G)={danbm|n>0,m0}

写一文法,使其语言是偶正整数的集合,要求不允许 0 开头。

G(S):S\rarrB(A|B|C)A\rarr1|3|5|7|9B\rarr2|4|6|8C\rarr0

句柄是直接短语中的,位居图最左的一个短语。

已知 G(S):E\rarrT|E+TT\rarrF|TFF\rarr(E)|i,试给出表达式 i+(i+i) 的规范推导及语法树,并给出其短语、直接短语、句柄。

E\RarrE+T\RarrE+F\RarrE+(E)\RarrE+(E+T)\RarrE+(E+F)\RarrE+(E+i)\RarrE+(T+i)\RarrE+(F+i)\RarrE+(i+i)\RarrT+(i+i)\RarrF+(i+i)\Rarri+(i+i)

ea6ebeac5cad775875b5f263b082418f.png

短语:i1i2i3i2+i3(i2+i3)i1+(i2+i3)

直接短语:i1i2i3

句柄:i1

正规式、NFA 与 DFA

设计一个 DFA,识别 R=(ab)ba 的描述的正规集合。

  1. 构造该正规式所对应的 NFA;
  2. 将所求的 NFA 确定化;
  3. 将所求的 DFA 最小化。

DFA 转 NFA 主要靠“闭包 a”法(先取输入能到达的集合,再取空串能到达的集合,两结果合并)。

  1. IIaIb
    [S,A,B,G,F][G,F][A,B,C,G,F]
    [G,F][G,F][A,B,G,F]
    [A,B,C,G,F][F,G,Z][A,B,C,G,F]
    [A,B,G,F][G,F][A,B,C,G,F]
    [F,G,Z][G,F][A,B,G,F]
  2. 先将终态和非终态分成两个集:K1={1,2,3,4}K2={5} 对于 K1 中的 3 态输入 a 则进入 K2 集,而 1、2、4 态输入 a 仍然在 K1 中,故 K1 可一分为二 K11={1,2,4}K12={3};考察 K11 对于 1、4 态输入 b 到达 3 态而 2 态输入 b 到达 4 态。故 K11 可一分为二 K111={1,4}K112={2}

    其状态图如下:

LL(1) 文法

已知文法 G(S):S\rarrS+aF|aF|+aFF\rarraF|a,求:

  1. 消除左递归和回溯;
  2. 构造 FIRST、FOLLOW、SELECT 集合;
  3. 判断其是否是 LL(1) 文法;
  4. 构造 LL(1) 文法分析表;
  5. 分析 +a*a 是否是文法的句子。
  1. G(S):S\rarraFS|+aFSS\rarr+aFS|ϵF\rarraFF\rarrF|ϵ

First 元素即取右部的第一个终结字符;Follow 元素指的是左部符号在全局任意右部之后的终结字符,而不是 First 元素之后的元素;Select 元素指的是推导式中左部能推出的全部起始符号,如果右部为空则指向左部的 Follow 集合与右部的 First 集合(去掉空串)的并集。

  1. FIRST(S)={a,+}FIRST(S)={+,ϵ}FIRST(F)={}FIRST(F)={,ϵ}

    FOLLOW(S)={#}FOLLOW(S)={#}FOLLOW(F)={+,#}FOLLOW(F)={+,#}

    SELECT(S\rarraFS)={a}SELECT(S\rarr+aFS)={+}SELECT(S\rarr+aFS)={+}SELECT(S\rarrϵ)={#}SELECT(F\rarraF)={}SELECT(F\rarrF)={}SELECT(F\rarrϵ)={+,#}

  2. 因为 {a}{+}=\empty{+}{#}=\empty{}{+,#}=\empty,故该文法是 LL(1) 文法。

  3. 预测分析表为:

    a+*#
    SS\rarraFSS\rarr+aFS
    S'S\rarr+aFSS\rarrϵ
    FF\rarraF
    F'F\rarrϵF\rarrFF\rarrϵ
  4. 符号串 +a*a 是否为句子的分析过程:

    步骤符号栈 S输入串规则
    1#S+a*a#S\rarr+aFS
    2#SFa++a*a#匹配
    3#SF*a#F\rarraF
    4#SFa*a#匹配
    5#SF#F\rarrϵS\rarrϵ
    5##成功,STOP

LR(0) 与 SLR(1) 文法

给定文法 G(A):A\rarraAd|aAb|ϵ

  1. 判断该文法是否是 SLR(1) 文法;
  2. 若是,则构造其分析表;
  3. 对输入串 ab 进行分析。
  1. 拓广文法:

    G(A):A\rarrA (0)A\rarraAd (1)A\rarraAb (2)A\rarrϵ (3)

    构造识别该文法所有规范句型活前缀的 DFA:

    dfa.png

    发现 I2 存在移进-规约冲突。

    FIRST(A)={a,ϵ}FOLLOW(A)={d,b,#},故 FOLLOW(A){a}=\empty,是 SLR(1) 文法。

ACTION 表示遇到终结符,GOTO 表示遇到非终结符;i 表示拓广文法里式子的序号,Si 表示移进(变框),ri 表示使用第 i 个规约式,acc 表示接受(推理结束)。

  1. 构造 SLR(1) 分析表:

    img

  2. 输入串 ab 分析过程:

    dfa.png

遵从 CC BY-NC-SA 4.0