BUAA 编译作业 练习2-1 2-2 2-3

练习2-1

  1. 给出下述句子的推导,并画出语法树:

    (1) John ate the big peanut

    (2) John ate the big brown peanut

    (3) John ate the big roasted peanut

    (2)(3)推导方式类似,区别为最后的<名词短语>继续推导为<形容词><名词短语>

  2. 利用规则2-1,除最左推导外,给出句子"The big elephant ate the peanut"的另外两种推导(其中一种为最右推导)。

    注:所谓最左(最右)推导,是指在推导的每一步中,若符号串中有两个以上语法成分(非终结符号)同时存在时,总是选取最左边(最右边)的语法成分进行推导。后面将给出这两种推导的形式定义。

练习2-2

  1. 令A={0,1,2},又令x=01,y=2和z=001,写出如下符号串及其长度:

    xy={012} |xy|=3

    xyz={012001} |xyz|=6

    x4={01010101} |x4|=8

    (x3)(y2)={01010122} |(x3)(y2)|=8

    (xy)2={012012} |(xy)2|=6

  2. 令A={0,1,2},写出集合A+和集合A*的7个最短的符号串。

    A+: 0,1,2,00,01,02,10

    A*: ε,0,1,2,00,01,02

  3. 试证明:A+=AA*=A*A

    由定义:A+ =A1∪A2∪A3∪......∪An∪...... ={x, x2, x3, ... ,xn,... |x∈A}

    A* =A0∪A+={ε, x, x2, x3, ... ,xn,... |x∈A}

    故 A ={x, x2, x3, ... ,xn,... |x∈A}

    ={xε, xx, xx2, x3, ... ,xn,... |x∈A}

    =AA*

    ={εx, xx, x2x, x3x, ... ,xnx,... |x∈A}

    =A*A

练习2-3

  1. 写一文法,使其语言是偶整数的集合。

    G = <Vn,Vt,P,Z> = <{F,S,D,N}, {0,1,2,...,9,+, -}, P, S>

    P:

    F ::= + | -

    S ::= FND | FD | ND | D

    D ::= 0 | 2 | 4 | 6 | 8

    N ::= NN | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

  2. 写一文法,使其语言是偶整数的集合,但不允许有以0开始的偶整数。

    G = <Vn,Vt,P,Z> = <{F,S,K,D,N}, {0,1,2,...,9}, P, S>

    P:

    F ::= + | -

    S ::= KD | D

    K ::= KN | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

    D ::= 0 | 2 | 4 | 6 | 8

    N ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

  3. 设文法G的规则是< A > ::= b< A >|cc, 试证明:cc, bcc, bbcc, bbbcc ∈ L[G]。

    A => cc ∈ L[G]

    A => bA => bcc ∈ L[G]

    A => bA => bbA => bbcc ∈ L[G]

  4. 有文法G3[<表达式>]:

    <表达式> ::= <项> | <表达式>+<项> | <表达式>-<项>

    <项> ::= <因子> | <项>*<因子> | <项>/<因子>

    <因子> ::= (<表达式>) | i

    试给出下列符号串的推导:i, (i), i* i, i* i+i , i*(i+i)。

    <表达式> => <项> => <因子> => i

    <表达式> => <项> => <因子> => (<表达式>) => (<表达式>) => (<项>) => (<因子>) => (i)

    <表达式> => <项> => <因子> => <项>*<因子> => <项> *i => <因子> *i => i *i

    <表达式> => <表达式>+<项> => <表达式>+i => i*i+i

    <表达式> => <表达式>+<项> => <表达式>+<因子> => <表达式>+ (<表达式>) => <表达式>+ (<表达式>+<项>) => i+(i+i)

9. 设文法G为

        N ::= D |ND

        D ::= 0|1|2|3|4|5|6|7|8|9

        (1) G的语言L(G)是什么?

        (2) 给出句子0125和783的最右推导(规范推导)和最左推导。

        (1) L(G) = {0,1,2,3,4,5,6,7,8,9}

        (2) 0125: 最右:N => ND => N5 => ND5 => N25 => ND25 => N125 => D125 => 0125

                        最左:N => ND => NDD => NDDD => DDDD => 0DDD => 01DD => 012D => 0125

            783: 最右:N => ND => N3 => ND3 => N83 => D83 => 783

                    最左:N => ND => NDD => DDD => 7DD => 78d =>783

知识点

从集合的角度看语言(符号、符号串)

符号: 字母表中的元素 例: a,b,c (–用英文字母表开头的小写字母和字母表靠近末尾 的大写字母来表示符号)

符号串: 符号的有穷序列 例:a, aa, ac, abc,... (用英文字母表靠近末尾的小写字母来表示符号串)

文法的形式定义:4元组

文法::G=<Vn,Vt,P,Z>

推导: 直接推导:v=>w

间接推导:v=>u0=>u1=>u2=>...=>un=w

规约

递归规则:规则右部具有和左部相同非终结符号。

简单短语: Z=*=>xUy且U=>u,称u是一个相对于非终结符号U的句型w的简单短语。

句柄: 任一句型最左简单短语称为该句型的句柄。

构造文法的基本技巧 :枚举、重复生成、对称

推导树:给定文法,推导句子

复习

文法:G=(Vn,Vt,P,Z)

  • 若有规则U ::= u,且 v=x Uy,w=xuy, 则有推导 xUy =>xuy ,即 v =>w

  • 注意弄清 =>【上面是+,*,|,+|】的概念

  • 文法G对应的语言L(G[Z]) = {x| x∈Vt*, Z+=>x}

  • 递归U =+= ...U...

  • 有句型w=xuy,若Z=*=>xUy,且U=+=u,则u是句型w相对于U的短语

  • 简单短语: Z=*=>xUy且U=>u,称u是一个相对于非终结符号U的句型w的简单短语。

  • 句柄: 任一句型最左简单短语称为该句型的句柄。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
BUAA(北京航空航天大学)编译设计文档是一个重要的技术文档,旨在记录编译器的整个设计过程,包括底层硬件平台和上层软件环境的选择、编译器设计原理和算法、编译器的组成模块、编译过程的各个阶段以及错误处理等。 首先,BUAA编译设计文档应明确描述底层硬件平台和上层软件环境的选择,例如CPU架构、操作系统等。这对于后续编译器的设计和实现起到了基础性的作用。 其次,对于编译器设计原理和算法的描述是设计文档中的重要部分。这部分应对编译器的前端、中端和后端进行详细的说明。前端涉及到词法分析、语法分析和语义分析等,中端包括优化和中间代码生成,后端则包括目标代码生成和代码优化等。对于每个阶段的算法和实现细节都应详细记录。 此外,编译器的组成模块也应在设计文档中列出。例如,符号表管理模块、类型检查模块、代码生成模块等。对于每个模块,应描述其功能、组成和实现细节,并给出相应的流程图或类图进行说明。 编译过程的各个阶段也是设计文档的重点内容。例如,从源代码到目标代码的整个编译过程应通过流程图或文字描述清楚。这包括了各个阶段的输入输出以及相互之间的关系。 最后,BUAA编译设计文档还应包括对错误处理的描述。这包括语法错误、类型错误和编译错误等的处理方式和处理流程。同时,还需说明如何生成有用的错误信息,以方便开发者对错误进行调试和修复。 总之,BUAA编译设计文档是对编译器设计过程进行详细记录和说明的文档,涵盖了底层硬件平台和上层软件环境的选择、编译器设计原理和算法、编译器的组成模块、编译过程的各个阶段以及错误处理等内容。它是编译器开发和维护的重要参考资料,为开发者提供了设计思路和技术指导。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值