2.2 节的练习

2.2.1

考虑下面的上下文无关文法:

S -> S S + | S S * | a

  1. 试说明如何使用该文法生成串 aa+a*
  2. 试为这个串构造一颗语法分析树
  3. ⧗ 该文法生成的语言是什么?试证明

解答

  1. S -> S S * -> S S + S * -> a S + S * -> a a + S * -> a a + a *
  2. 把 a 看成是运算数,L = {支持加法和乘法的表达式的后缀表示形式}

2.2.2

下面各个文法生成什么语言?证明你的每一个答案

  1. S -> 0 S 1 | 0 1
  2. S -> + S S | - S S | a
  3. S -> S ( S ) S | ε
  4. S -> a S b S | b S a S | ε
  5. ⧗ S -> a | S + S | S S | S * | ( S )

解答

  1. L = {0n1n | n>=1}
  2. L = {支持加法和减法的表达式的前缀表达形式}
  3. L = {匹配括号的任意排列和嵌套的括号串,包括 ε}
  4. L = {数量相同的a和b组成的符号串,包括 ε}
  5. ?

2.2.3

上一题中哪些文法具有二义性

解答

  1. 没有
  2. 没有
  3. 有

  4. 有

  5. 有

    2.2.4

为下面的各个语言构建无二义性的上下文无关文法。证明你的文法都是正确的。

  1. 用后缀方法表示的算数表达式
  2. 由逗号分隔开的左结合的标识符列表(标识符以 id 表示,以下同)
  3. 由逗号分隔开的右结合的标识符列表
  4. 有整数、标识符、4个二目运算符 +, -, *, / 构成的算数表达式
  5. ! 在上一题的运算符中增加单目+ 和单目-构成的算数表达式

解答

  1. E -> E E op | num
  2. list -> list , id | id
  3. list -> id , list | id
  4. expr -> expr + term | expr - term | term

    term -> term * factor | term / factor | factor

    factor -> id | num | (expr)

  5. 注:单目加减运算的优先级最高

    expr -> expr + term | expr - term | term

    term -> term * unary | term / unary | unary

    unary -> + factor | - factor

    factor - > id | num | (expr)

2.2.5

  1. 证明:用下面文法生成的所有二进制串的值都能被3整除。(提示:对语法分析树的节点树木使用数学归纳法)

    num -> 11 | 1001 | num 0 | num num

  2. 上面的文法是否能生成所有能被3整除的二进制串?

解答

  1. 证明

    符合该文法的二进制串一定是由任意数量的 11,1001 和 0 组成的最左位不为0的序列

    该序列的十进制和为:

    sum

    = Σn (21 + 20) * 2 n + Σm (23 + 20) * 2m

    = Σn 3 * 2 n + Σm 9 * 2m

    显然是能被3整除的

  2. 不是。二进制串10101,数值为21,可被3整除,但无法由文法推导出。

    注: 还有更一般性的证法么?

2.2.6

为罗马数字构建一个上下文无关文法

注:该文法不考虑罗马数字的上下划线表示,故只能产生小于4k的数字

解答

规则参考 维基百科:罗马数字

  • 根据wiki中讲述的规则,可以发现个位数的表示可以分为4类:

    I, II, III | I V | V, V I, V II, V III | I X

    即有产生式:

    digit -> smallDigit | I V | V smallDigit | I X

    smallDigit -> I | II | III | ε

    其他数位的表示类似。

  • 还可以发现:罗马数字和阿拉伯数字有比较简单的数位对应关系。

    例如:

    • XII - X, II - 10 + 2 - 12
    • CXCIX - C, XC, IX - 100 + 90 + 9 - 199
    • MDCCCLXXX - M, DCCC, LXXX - 1000 + 800 + 80 - 1880
  • 根据这两个规律推导出产生式:

    romanNum -> thousand hundred ten digit

    thousand -> M | MM | MMM | ε

    hundred -> smallHundred | C D | D smallHundred | C M

    smallHundred -> C | CC | CCC | ε

    ten -> smallTen | X L | L smallTen | X C

    smallTen -> X | XX | XXX | ε

    digit -> smallDigit | I V | V smallDigit | I X

    smallDigit -> I | II | III | ε

2.2 节的练习--Compiler principles, technologys, &tools的更多相关文章

  1. Compiler Principles 语法分析

    语法分析的两种思维方式:1:自顶向下分析 :从语法树的根部推下来一直推到需要确认的终结符号串为止:就是为了找到一个符号串的最左推导 自顶向下分析,因为文法有些是以非终结符开头的另外文法中还可能含有右部 ...

  2. ACM会议列表与介绍(2014/05/06)

    Conferences ACM SEACM Southeast Regional Conference ACM Southeast Regional Conference the oldest, co ...

  3. Github上的1000多本免费电子书重磅来袭!

    Github上的1000多本免费电子书重磅来袭!   以前 StackOverFlow 也给出了一个免费电子书列表,现在在Github上可以看到时刻保持更新的列表了. 瞥一眼下面的书籍分类目录,你就能 ...

  4. Github 的一个免费编程书籍列表

    Index Ada Agda Alef Android APL Arduino ASP.NET MVC Assembly Language Non-X86 AutoHotkey Autotools A ...

  5. ASP.NET Core 中文文档 第二章 指南(8) 使用 dotnet watch 开发 ASP.NET Core 应用程序

    原文:Developing ASP.NET Core applications using dotnet watch 作者:Victor Hurdugaci 翻译:谢炀(Kiler) 校对:刘怡(Al ...

  6. Hive安装(一)之环境配置

    Hive Web Interface(HWI)简介:Hive自带了一个Web-GUI,功能不多,可用于效果展示,如果没有安装Hue的话,是个不错的选择. 由于hive-bin包中没有包含HWI的页面, ...

  7. Ant自动编译打包&发布 android项目

    Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自动编译打包了. ...

  8. Core Java Volume I — 3.4. Variables

    3.4. VariablesIn Java, every variable has a type. You declare a variable by placing the type first, ...

  9. 搭建hive1.2.1图形界面

    下载:apache-hive-1.2.1-src.tar apache-hive-1.2.1-src.tar 解压,cd apache-hive-1.2.1-src/hwi 命令:jar cfM hi ...

随机推荐

  1. 反向Ajax,实现服务器向客户端推送消息

    反向Ajax的基本概念是客户端不必从服务器获取信息,服务器会把相关信息直接推送到客户端.这样做的目的是解决Ajax传统Web模型所带来的一个限制:实时信息很难从技术上解决.原因是,客户端必须联系服务器 ...

  2. char*或string转换成LPCWSTR

    VS2010默认是Unicode的,在VC 6.0中编译成功的项目在VS2010中常会出现类型错误. 经常出现的错误是:不能从const char *转换为LPCWSTR 如使用CreateDC(&q ...

  3. LeetCode 笔记系列 20 Interleaving String [动态规划的抽象]

    题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given: ...

  4. marquee|各种文字滚动代码(适用公告)

    marquee|各种文字滚动代码(适用公告)  

  5. ecshop 常见问题汇总

    下面68ECSHOP开发中心就和大家说说ecshop使用中常见的问题 1.如何修改网站"欢迎光临本店"       回答(1) languages\zh_cn\common.php ...

  6. 华为HG255D路由器使用OH3C进行中大校园网认证

    之前用的上海贝尔RG100A-AA路由器,被我无情地摧残了,电源按钮挂了,只能换个路由器.由于在校内,使用OP还是比较方便的,网上淘了这款华为HG255D,店主已刷好OP,无线速率300M,想想也是值 ...

  7. Github 笔记

    在本地创建并切换 git checkout -b your_branch_name 把本地分支的修改提交到远端的分支上 git push origin local_branch_name:remote ...

  8. Sources

    作为一个初学者显然是没有能力自己写教程向的文章的 所以就写个整合资源贴整合一下自己学每个知识点的来源 (其实不是很全因为不记得之前看了什么) ————————————————————————————— ...

  9. MongoDB学习笔记二:创建、更新及删除文档

    插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个&q ...

  10. mysql事务,START TRANSACTION, COMMIT和ROLLBACK,SET AUTOCOMMIT语法

    http://yulei568.blog.163.com/blog/static/135886720071012444422/ MyISAM不支持 START TRANSACTION | BEGIN ...