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组成的符号串,包括 ε}

2.2.3

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

解答

  1. 没有
  2. 没有
  3. 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. Android - 定时服务 - Timer

    注:在项目中,有时可能会有一些定时执行的任务,这时,一般都会在一个service中写一个定时器. 例: Service类: import java.util.Timer; import java.ut ...

  2. iOS webView 远程html加载本地资源

    昨天,一个朋友让我帮他在IOS上弄这样一件事情: webView 调用远程URL,并且让远程的web 通过自定义标签能实现内嵌本地的图片.js 或音频等. 比如:在服务器端 的html文件中 这样写到 ...

  3. Centos搭建SVN服务器三步曲

    搭建SVN服务,有效的管理代码,以下三步可以快速搞定.1.安装 #yum install subversion 判断是否安装成功#subversion -v svnserve, version 1.6 ...

  4. Android 学习第3课,小例子

    package temperature.convert; import java.util.Scanner; public class Converter { public static void m ...

  5. C++学习笔记23:库

    静态库(Archives) 后缀一般为"*.a" 使用两个目标文件创建单一静态库的编译与链接命令:ar cr libtest.a  test1.o test2.o 链接器搜索静态库 ...

  6. 《JavaScript模式》第5章 对象创建模式

    @by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...

  7. [转载]MCU DSP ARM 嵌入式 之间的区别

    2016-06-28 10:31:24) 嵌入式"这是个概念,准确的定义没有,各个书上都有各自的定义.但是主要思想是一样的,就是相比较PC机这种通用系统来说,嵌入式系统是个专用系统,结构精简 ...

  8. ExpandableListView二级列表

    package com.example.dajj; import android.os.Bundle;import android.app.Activity;import android.view.M ...

  9. mactype支持qq浏览器

    win7上使用mactype之后qq浏览器网页显示的字体不清晰,颜色也比较浅.解决方法: 1. 再qq浏览器地址栏中输入:qqbrowser://flags 2.在设置中启用DirectWrite高清 ...

  10. LEETCODE —— Single Number

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...