首页 > 其他分享 >编译原理第二章习题存档

编译原理第二章习题存档

时间:2022-11-21 21:34:59浏览次数:66  
标签:短语 文法 终结符 推导 规约 存档 编译 型文法 习题

教材:《编译原理》  西北工业大学出版社  主编:蒋立源 康慕宁

这本书不太说人话,因为概念严谨描述出来看着就很晕,下文主要在意会它到底是个什么东西以及干了什么事。

第二章 前后文无关文法和语言

1. 概念介绍

文法:类似于下面的递推式

G[S]:S→AB     A→aA|ε    B→bBc|bc

其中,能继续往下推的为非终结符号,通常用大写字母表示,记作V(nonterminate);反之为终结符号,用小写字母表示,记作V(terminate)。这些递推式叫产生式,记作P;最开始用来推导的叫开始符号,记作S,通常也直接写作S。ε为空符号串。

综上,一个文法可以表示为G[S]=(VN ,VT ,P ,S).

句子:文法能推出的一个全是终结符号的符号串。

语言:所有句子的集合。

接下来对句子进行分析,也就是句型分析。我们主要关心一个句子是怎么被推导出来的,以及它的逆过程,规约。

不妨假设产生式的左部只有一个非终结符。

为了统一,定义规范推导和规范规约。

规范推导:也叫最右推导,意为每次拿最右边的非终结符号继续推;

规范规约:也叫最左规约,每次拿最左边能规约的一串东西规约。

推导的过程很容易用 树 这一结构表示,编译原理中称之为语法树。每次推导我们给一个非终结符号添加几个子节点,规约的时候把子树缩为其父节点。如果一个句子有两个本质不同的语法树,那么这句话具有二义性。

为了方便描述规约这一过程,我们又造出了几个概念:

短语:若干相邻叶子结点组成的东西。容易看出短语是相对于非终结符而言的,也就是一个非终结符生成的终结符串。

直接短语:只推导了一步得到的短语。

句柄:下一步规约要规约掉的东西。肯定是一个直接短语。如果有多个直接短语,选择最左边的那个。放到语法树上,就是最左简单子树的叶子节点。

对于一个文法,出于人类的本能,我们希望它足够简洁。适当的ε,也就是空产生式,便于我们描述一种语言(比如第三章把一个正则式转化为文法时)。但如果最后时不时生成一个空串就没有必要了。为了化简这种情况,出现了几个算法。ε-产生式的消除

还有一种产生式是单产生式,也就是最后只有一个字符的情况。不过这个化简好像不考就先不写了(……

上述描述都是建立在产生式的左部只有一个非终结符的基础上。其他情况各自有自己的名字,也就是文法的Chomsky分类。

0型文法:无限制文法。长成什么样都可以

1型文法:类似于αAβ->...,也叫上下文相关文法,只有在特定上下文中才能替换。并且定义它的长度永远不会缩短。

2型文法:就是上面举例子的文法

3型文法:产生式右部只有一个非终结符号,也叫正规文法。

现在你已经简单了解了文法,来试试这些题吧

2. 习题存档

1. 文法和语言的互相转换

L={anbn|n≥0}

ans:S->aSb|ε

L={anbmcp|n,m,p≥0}

ans:S->aS|X, X->bX|Y, Y->cY|ε

可能是我上课没听,但好像没有什么正规方法,手玩几个意会一下(

2. 最左最右推导

硬推

3. 证明二义性文法

找出两个语法树

4. 消除空产生式

往算法里套

 

 

 

标签:短语,文法,终结符,推导,规约,存档,编译,型文法,习题
From: https://www.cnblogs.com/capterlliar/p/16913421.html

相关文章

  • C语言习题整理收录3
    0从键盘任意输入一个整型表示的月份值,用指针数组编程输出该月份的英文表示,若输入的月份值不在1~12之间,则输出“Illegalmonth”。**输入格式要求:"%d"提示信息:“Inputmon......
  • javascript - 练习题:事件练习 - 扫雷
    HTML<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="w......
  • go环境以及编译器安装
    go安装1.win10安装GO去Go官网下载,安装包验证安装cmd输入goversion,能出现版本号即可2.Goland安装Goland官网下载,下载好后直接安装即可3.创建go项目选择第一......
  • 使用cmake编译c++源代码
    构建项目的背景:现在的主流都是编写一个cmakelist.txt,通过cmake去构建一个makefile,再make这个makefile生成可执行文件或者动态库静态库。 法1:1.新建一个CMakeLists.tx......
  • k8s下Jenkins分部署部署:jenkinfiles--maven编译+镜像推送+sonar代码扫描+部署+企业微
    k8s下Jenkins分部署部署:jenkinfiles--maven编译+镜像推送+sonar代码扫描+部署+企业微信通知准备好k8s集群、安装好Jenkins、准备gitlab的ssh密钥、准备k8s的config、安装......
  • idea反编译
    1、问题描述只有jar包,反编译下,看几个配置;2、问题说明用的idea里面的插件,javaDecoplier,可以反编译jar包,效果挺好的,反编译出来的.java没乱码,可以直接看;2.1.idea安装插件......
  • C++ using 编译指令与名称冲突
    using编译指令:它由名称空间名和它前面的关键字usingnamespace组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符。在全局声明区域中使用using编译指......
  • javascript - 练习题:事件练习 - 贪吃蛇
    贪吃蛇原生JS(非面向对象的方式),渡一教学的笔记;地图坐标{0,0}{1,0}{2,0}{3,0}{4,0}{0,1}{1,1}{2,1}{3,1}{4,1}{0,2}{1,2}{2,2}{3,2}{4,2}{0,3}{1,3}{2,3}{3,3}{4,3}{0,4}{1,4}......
  • 使用 CMake 作为嵌入式开发构建工具执行交叉编译
    CMake的基础入门:​​cmake简明基础知识​​默认情况下,cmake使用本地编译器,如gcc,而嵌入式开发往往使用的是交叉编译器,如riscv-none-embed-gcc,cmake不知道要使用哪个交......
  • risc-v gcc 编译 atomic 指令时产生 illegal operands 错误的解决办法
    错误的写法:amoadd.wa1,a0,a2这是参照OpenRISC-VReferenceCard的格式书写的,这将将产生错误:illegaloperands`amoadd.wa1,a0,a2'正确的写法:amoadd.wa1,a2,(a0)凡......