2.2 节的练习--Compiler principles, technologys, &tools
2.2 节的练习
2.2.1
考虑下面的上下文无关文法:
S -> S S + | S S * | a
- 试说明如何使用该文法生成串 aa+a*
- 试为这个串构造一颗语法分析树
- ⧗ 该文法生成的语言是什么?试证明
解答
S->SS * ->SS + S * -> aS+ S * -> a a +S* -> a a + a *
- 把 a 看成是运算数,L = {支持加法和乘法的表达式的后缀表示形式}
2.2.2
下面各个文法生成什么语言?证明你的每一个答案
- S -> 0 S 1 | 0 1
- S -> + S S | - S S | a
- S -> S ( S ) S | ε
- S -> a S b S | b S a S | ε
- ⧗ S -> a | S + S | S S | S * | ( S )
解答
- L = {0n1n | n>=1}
- L = {支持加法和减法的表达式的前缀表达形式}
- L = {匹配括号的任意排列和嵌套的括号串,包括 ε}
- L = {数量相同的a和b组成的符号串,包括 ε}
- ?
2.2.3
上一题中哪些文法具有二义性
解答
- 没有
- 没有
有

有

有

2.2.4
为下面的各个语言构建无二义性的上下文无关文法。证明你的文法都是正确的。
- 用后缀方法表示的算数表达式
- 由逗号分隔开的左结合的标识符列表(标识符以 id 表示,以下同)
- 由逗号分隔开的右结合的标识符列表
- 有整数、标识符、4个二目运算符 +, -, *, / 构成的算数表达式
- ! 在上一题的运算符中增加单目+ 和单目-构成的算数表达式
解答
- E -> E E op | num
- list -> list , id | id
- list -> id , list | id
expr -> expr + term | expr - term | term
term -> term * factor | term / factor | factor
factor -> id | num | (expr)
注:单目加减运算的优先级最高
expr -> expr + term | expr - term | term
term -> term * unary | term / unary | unary
unary -> + factor | - factor
factor - > id | num | (expr)
2.2.5
证明:用下面文法生成的所有二进制串的值都能被3整除。(提示:对语法分析树的节点树木使用数学归纳法)
num -> 11 | 1001 | num 0 | num num
上面的文法是否能生成所有能被3整除的二进制串?
解答
证明
符合该文法的二进制串一定是由任意数量的 11,1001 和 0 组成的最左位不为0的序列
该序列的十进制和为:
sum
= Σn (21 + 20) * 2 n + Σm (23 + 20) * 2m
= Σn 3 * 2 n + Σm 9 * 2m
显然是能被3整除的
不是。二进制串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的更多相关文章
- Compiler Principles 语法分析
语法分析的两种思维方式:1:自顶向下分析 :从语法树的根部推下来一直推到需要确认的终结符号串为止:就是为了找到一个符号串的最左推导 自顶向下分析,因为文法有些是以非终结符开头的另外文法中还可能含有右部 ...
- ACM会议列表与介绍(2014/05/06)
Conferences ACM SEACM Southeast Regional Conference ACM Southeast Regional Conference the oldest, co ...
- Github上的1000多本免费电子书重磅来袭!
Github上的1000多本免费电子书重磅来袭! 以前 StackOverFlow 也给出了一个免费电子书列表,现在在Github上可以看到时刻保持更新的列表了. 瞥一眼下面的书籍分类目录,你就能 ...
- Github 的一个免费编程书籍列表
Index Ada Agda Alef Android APL Arduino ASP.NET MVC Assembly Language Non-X86 AutoHotkey Autotools A ...
- ASP.NET Core 中文文档 第二章 指南(8) 使用 dotnet watch 开发 ASP.NET Core 应用程序
原文:Developing ASP.NET Core applications using dotnet watch 作者:Victor Hurdugaci 翻译:谢炀(Kiler) 校对:刘怡(Al ...
- Hive安装(一)之环境配置
Hive Web Interface(HWI)简介:Hive自带了一个Web-GUI,功能不多,可用于效果展示,如果没有安装Hue的话,是个不错的选择. 由于hive-bin包中没有包含HWI的页面, ...
- Ant自动编译打包&发布 android项目
Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自动编译打包了. ...
- 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, ...
- 搭建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 ...
随机推荐
- xcode代码提示功能失效的解决方法
xcode 自动提示很好用 然而大量的工作也是让他吃不消了 结果今天提示功能给我来了个罢工 这当然是不行的 也是万能的搜索帮我解决了这个问题 方法很多 选择了简单的 xcode --> Wind ...
- 判断CAD图纸版本
判断CAD图纸版本Dwg文件版本 使用记事本打开DWG图纸文件,在最开始有6个字母和数字组合,即为图纸的版本号 AC1015:CAD2000版本: AC1018:CAD2004版本: AC1021:C ...
- C++异常处理的问题
一般在C语言中,是通过返回值或者设置errno的方式来标识错误的 但在C++里面,构造函数是没有返回值的,于是发明了异常的方式:为了正确的向使用者表明 异常抛出的原因,你必须弄清楚异常抛出的原因(比如 ...
- UIkit框架之UITabBarController
1.继承链:UIviewController:uiresponder:NSObject 2.访问tab bar控制器的属性 (1)@property(nonatomic, weak) id< U ...
- Libgdx 开发指南(1.2) 应用框架——模块概览
模块概览 引言 LibGDX由一些为一个典型游戏架构中的各个步骤提供服务的模块组成. Input:为所有平台提供一致的输入模型与处理器.支持键盘.触屏.加速度传感器与鼠标. Graphics:使用硬件 ...
- mouseover 移入某个元素后停留一段时间再执行函授,我用于解决轮播图下面计数用的元素快速移入后会出BUG的问题。
var stop; $(this).bind("mouseover",function(){ stop= setTimeout(function(){ },200); }).bin ...
- 如何把TOMCAT 添加到服务中自动启动
1.配置系统参数: JAVA_HOME:C:\Program Files\Java\jdk1.8.0_51 //本机Jdk的安装路径,已配置相关Java应用的无需再配置. CATALINA_HOM ...
- .net解决数据导出excel时的格式问题
在项目中一般都需要将报表数据导出到EXCEL中,但经常出现导出长串数据(如身份证)到EXCEL中后显示为科学计数法的格式,或者报表中显示为001的数据导出到Excel后成了1的格式. 下面简单介绍一下 ...
- netfilter-IPv4实现框架分析(一)
基于Linux-2.6.30版本,具体实现net\ipv4\netfilter目录下,入口文件为net\ipv4\netfilter\iptable_filter.c,入口/出口函数为模块的init函 ...
- Bowtie2
如何使用Bowtie2 相似功能的有: 创建索引 创建索引bowtie2-build使用的命令. -f指定要索引文件后,再给予索引的名称.名称可以连接到任何. bowtie2 build-f refe ...