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. 【转】Mybatis 3.1中 Mapper XML 文件 的学习详解

    MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...

  2. Sql 注意点

    1. Set.Select赋值 使用SELECT语句来替代SET命令的主要优点是:可以在一个操作内同时给多个变量赋值.执行下面的SELECT语句,通过SELECT语句赋值的变量就可以用于任何操作了. ...

  3. python3登录极路由并读取宽带帐号帐号密码.py

    python3登录极路由并读取宽带帐号帐号密码,fiddler抓包分析过程略... 步骤:1.登录路由,提取stok. 2.用stok拼成url,post请求 3.解析json数据 代码: " ...

  4. sqlserver数据库学习(-)数据类型

    ecimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边.decimal 数据类型存储了一个准确(精确)的数字表达法:不存储值的近似值. 定义 decimal 的列.变量和参数的 ...

  5. Jdk内置性能测试工具的介绍

    (一) JConsole JConsole使用JVM的可扩展性Java管理扩展(JMX)工具来提供关于运行于Java平台的应用程序的性能和资源消耗的信息. 在J2SE 5.0软件中,你需要启动使用-D ...

  6. 【OpenCV】图像的遍历

    Mat类的两种遍历比较快的方式,分别给出了按行和按列遍历,以及运行过程图. 原图: 按行遍历过程图 按列遍历过程图 代码如下: //ptr逐行访问 void ptrScanX(Mat& src ...

  7. Binary Tree Inorder Traversal -- LeetCode 94

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  8. sublime开发php必备工具集合(mac)

    sublime开发php必备工具集合(Mac) 相关链接:http://benmatselby.github.io/sublime-phpcs/ 目标: 直接在sublime中运行php代码 按PSR ...

  9. tensorflow2

    # step1 加载包import tensorflow as tf import numpy as np # step2 输入:随机产生数据 # Create 100 phony x, y data ...

  10. uget和aria2

    http://blog.csdn.net/luojiming1990/article/details/9078447 其中的aria2 -v要改成aria2c -v