编译原理二版答案
㈠ 急急急 求答案! 编译原理
如果你想对S求follow,那大概要做下面的两件事情
如果你发现有些rule包含Sb,那么b就属于follow(S)
如果你发现有些rule包含SB,那么first(B)就包含于follow(S)
如果你发现有些rule长得像Shit ::= xxxx S,那么follow(Shit)就包含于follow(S)
㈡ 编译原理:构造产生此语言的上下文无关文法G
对于文法G=(V, T, S, P),如果产生式的形式如下:
A -> xB
A -> x
其中A, B属于V,x属于T*,则称为右线性文法;相似的,如果产生式的形式如下:
A -> Bx
A -> x
则称为左线性文法。右线性文法和左线性文法统称为正则文法。
正则表达式的表达能力等价于正则文法,正则表达式的定义如下:
字母表中的任意字母是正则表达式,空串和空集也是正则表达式;
如果r, s是正则表达式,那么r|s, rs, r*, (r)也是正则表达式。
正则表达式的扩展:
r+:一个或多个重复
. :任意字符
[a-z]:字符范围
[^abc]:不在给定集合中的任意字符
r?:可选
正则表达式只能使用终结符(字母表中的字符),因而很容易变得复杂又难懂,实际中,经常使用正则描述,正则描述允许使用非终结符定义表达式,很像EBNF,但是它限制在未完全定义之前,不能使用非终结符,也就是说不允许递归或自嵌套。
像正则表达式的表达能力等价于正则文法一样,BNF范式的表达能力等价于上下文无关文法。BNF是“Backus Naur Form”的缩写。John Backus和Peter Naur首次引入一种形式化符号来描述给定语言的语法。
BNF的元符号:
::= 表示“定义为 ”,有的书上用-->
| 表示“或者”
< > 尖括号用于括起非终结符。
BNF的扩展EBNF:
可选项被括在元符号“[”和“]”中
重复项(零个或者多个)被括在元符号“{”和“}”中
仅一个字符的终结符用引号(")引起来,以和元符号区别开来
上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
BNF的扩展EBNF:
可选项被括在元符号“[”和“]”中
重复项(零个或者多个)被括在元符号“{”和“}”中
仅一个字符的终结符用引号(")引起来,以和元符号区别开来
上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
如上所述,上下文无关文法的递归性,对其分析方法也有很大影响。首先,用作识别这些结构的算法必须使用递归调用或显式管理的分析栈。其次,用作表示语言语义结构的数据结构现在也必须是递归的(通常是一颗分析树),而不再是线性的(如同用于词法和记号中的一样)了。
在程序设计语言中,通常用正则表达式描述词法规则。但是正则表示式的表达能力有限,她无法表达括号配对等语法形式,因而,需要引入表达能力更强的上下文无关文法。编译程序中常用正则文法表示词法,用上下文无关文法表示语法。那么程序语言中那些属于词法哪些属于语法呢?一个简单的办法,把所有能用正则文法表示的规则成为词法,即我们用尽可能的使用正则文法表示更多的东西,那些无法用正则表示式表示的成为句法,如C语言中的{ statement; }语法形式。语言中有些规则使用上下文无关文法仍然无法描述,例如变量的定义在使用之前,类型匹配等等,这些通常称为(静态)语义,它们在编译程序的静态语义检查阶段进行检测。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
㈢ 谁有百度文库的下载券帮我下个编译原理教程课后习题答案——第三章!急急急急!
2.2文法G[N]为
N→D|ND
D→0|1|2|3|4|5|6|7|8|9
G[N]的语言是什么?
解:G[N]的语言为V+。 V={0,1,2,3,4,5,6,7,8,9}
N=>ND=>NDD. . . .=>NDDDD.. .D=>D. . . . . .D
㈣ 编译原理教程(第二版)》(胡元义主编,西安电子科技大学出版社出版)课后习题答案
http://cache..com/c?m=13d3c3&p=9f769a448faf09ea08e2977e7f00&user=
㈤ 编译原理——First集与Follow集
First(A)为A的开始符或者首符号集。
如果两个A产生式 A -> α | β ,且FIRST(α)和FIRST(β)不相交;
下一个输入符号是x,若x∈FIRST(α),则选择 A->a ,若x∈FIRST(β),则选择 A->b 。
计算FIRST(X)的方法
如果算法看不懂,那我们来根据算法来模拟一下!
因为求FIRST集合如果有终结符号会比较好处理,所以我们逆顺序进行实施;
应该一看明白了!
Follow(A)指的是在某些句型中紧跟在A右边的 终结符号 的集合
一步一步来看
2.1 第一次迭代
第一种情况: FOLLOW(T)=FIRST(E')={ + }
第二种情况 : FOLLOW(E')=FOLLOW(E)={ $ }
第一种情况: FOLLOW(T)=FIRST(E')={ + }
第二种情况 : FOLLOW(T)=FOLLOW(E')={ + , $ }
第一种情况: FOLLOW(F)=FIRST(T')={ * }
第二种情况 : FOLLOW(T')=FOLLOW(T)={ + , $ }
第一种情况: FOLLOW(F)=FIRST(T')={ * }
第二种情况 : FOLLOW(F)=FOLLOW(T')={ + , * , $ }
第一种情况 : FOLLOW(E)={ $ , ) }
2.2 第二次迭代
由于我们列出了等值关系,所以只需要再走一次第一次迭代的过程就可以了!
因为主要是FOLLOW可能在变,所以我们只需要找到FOLLOW的等值关系即可
我在上面标出了第一次迭代的FOLLOW的最新版
下面我只要列出更新的即可
2.3 第三次迭代
第三次迭代就会发现 FOLLOW集合 不再发生改变,这时候规则结束,求出FOLLOW集合。
Follow比较容易出错,出错的点主要在迭代过程的第二种情况的: A -> αBβ 且FIRST(β)包含ε
我们容易忽略这种情况。
只要把每一次迭代过程都写在纸上,尤其注重 Follow集合 的等值!
㈥ 高手请进!急问编译原理:*0((0|1)*|01*0)*1的DFA图怎么画
先画出NFA 在根据 子集法 求出dfa 参考 《编译原理》课后习题答案%2B清华大学出版社第二版
中第四章 第一题 第二小题 相似
㈦ 编译原理 设文法G[S] 求答案!
·消除左递归 S→aAS'|∧aAS'
S'→VaAS'|ε对A的产生式提取左因子 A→∧aA' A'→A|ε
· 非终结符合 First Follow
S a∧ #
S’ V ε #
A ∧ #
A‘ ∧ #
Select(S→aAS')=a
Select(S→∧aAS')=∧
Select(S'→VaAS')=V
Select(S'→ε)=#
Select(A→∧aA')=∧
Select(A'→A)=∧
Select(A'→ε)=#
符合LL(1)文法
a ∧ V #
S S→aAS' S→∧aAS'
S' S'→VaAS' S'→ε
A A→∧aA'
A' A'→A A'→ε