编译原理第二章习题存档

Posted on 2022-11-21 21:26  Capterlliar  阅读(57)  评论(0编辑  收藏  举报

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

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

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

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. 消除空产生式

往算法里套