当前位置:首页 » 编程软件 » 编译原理冲突图的定义

编译原理冲突图的定义

发布时间: 2025-09-16 21:26:45

⑴ 计算机科学与技术中编译原理简答题

时间有点久记得不太真切,用通俗语言说,希望题主尽量查阅书籍参考资料自行验证理解。

1、什么是移进项目,什么是规约项目

这个是自顶向下和自下向上分析时候用到的。所谓移进就是不处理,所谓规约就是处理,合并,替换。比如当前符合某个正规式左部,就用这个正规式右部替换左部,称为规约。两种操作的目的都是为了分析整体是否符合语法树。

2、请给出生成C语言语句序列的文法(假定s表示任意一个语句,它为终结符)

关于这个,我感觉你描述的不是很清楚,因为C语言文法包含的正规式还是挺多的,如果单指statement的话,
statement_listà
statement
| statement_list statement

Statementà
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
再配合上相应的终结符。

3、能用上下文无关文法生成正规集吗?为什么?

可以。不过无法保证不含冲突。

4、计算first集和follow集对于构造自顶向下的语法分析器有什么作用?

可以用来排除冲突。例如移进-移进冲突,移进-规约冲突。

5、是否可能存在这样一个DFA,它的所有状态都是接受状态,包括其实状态,为什么?

这个爱莫能助,据我的构想是可以的,但是这样的DFA最终都会成为单一状态DFA。

⑵ C语言中变量为什么不能重复定义,我想问一下C语言里面的具体的机制。

因为定义就意味着给变量分配空间。暂不管重复定义有可能产生空间分配不合理的问题,首先变量名就是一个地址,只不过这个地址是由系统分配的,定义后,地址分出来,存储空间也被分配出来,变量名--地址就被固定下来。重复定义的话就要分出新地址,分配新的存储空间,原来的变量名--地址,与后来的变量名--地址,产生冲突,一样的名字,却是不同的地址,这是不允许的。
但是这种问题只会出现在标识符的链接属性一样的情况下,可以简单的理解为在同一个作用域重复定义是不可以的。如果在两个函数里分别定义int a,这种定义是可以的。因为这个a处于不同的作用域,就不算是重复定义了。
以上属于自己的理解,欢迎指正。

⑶ 编译原理——LR分析表

自底向上的语法分析

LR分析表的结构如上,其分为两个部分 Action Goto

两个参数状态i,终结符号a(s(i)代表第i个状态,r(i)代表第i条表达式)

Goto[i,A]=j

文法

容易得知这个文法可以推出 0 1 00 01 等的字符串。因为它是 左递归 。不适用于 LL 文法分析,只能使用 LR 分析。

因为本题入口有两个—— S → L·L S → L ,所以需要构造额外的产生式 S'->S

2.1 第一次遍历

我们从 [S -> . L·L] 开始,构造这个状态的闭包,也就是加上所有能从这个产生式推出的表项。

首先,判断 . 后面是否为 非终结符号A 。如果是,那我们就得找所有由 A-> 推出的产生式,并将它们添加进入 闭包 里(也就是State包里)。循环做即可。

因此我们可以得到 State 0 有

下一步,就是我的 . 往下一位移动。对每个符号X后有个 . 的项,都可以从 State 0 过渡到其他状态。

由以上6条式子可以得知下一位符号可以是 S L B 0 1 。所以自然可以得到5个状态。

State 1 是由 State 0 通过 S 转移到这里的,所以我们找出所有 State 0 中在 S 前有 . 的项。

此状态作为结束状态 Accept ,不需要继续状态转移了。

State 2 是由 State 0 通过 L 转移到这里的,所以我们找出所有 State 0 中在 L 前有 . 的项。

S -> . L·L S -> . L L -> . LB

有3条式子,现在我们将 . 向后推一格,就得到 State 1 的项了。

但是 . 之后的符号分别是 · $ B , B 为非终结符号,我们得包含 B -> 的项

State 3 是由 State 0 通过 B 转移到这里的,所以我们找出所有 State 0 中在 B 前有 . 的项。

因为 . 后没有其他符号了,因此这个状态不需要继续转移了。

State 4 是由 State 0 通过 0 转移到这里的,所以我们找出所有 State 0 中在 0 前有 . 的项。

因为 . 后没有其他符号了,因此这个状态不需要继续转移了。

很简单,同样的道理找 State 5

State 5 是由 State 0 通过 1 转移到这里的,所以我们找出所有 State 0 中在 1 前有 . 的项。

因为 . 后没有其他符号了,因此这个状态不需要继续转移了。

好的,现在我们第一次遍历完成。

2.2 第二次遍历

第二次遍历自然从 State 2 开始。

我们回到 State2 ,可以看出 . 之后的符号有 · B 0 1 。

State 6 是由 State 2 通过 · 转移到这里的,所以我们找出所有 State 2 中在 · 前有 . 的项。

S -> L. ·L 只有1条,我们往后移发现 L 又为非终结符号,参考 State 0 做的操作,我们得找出所有的式子。

共有5条式子,共同组成 State 6 ,由上面的式子可以看出我们还得继续下一次遍历。先不管着,我们进行下一次状态查找。

State 7 是由 State 2 通过 B 转移到这里的,所以我们找出所有 State 2 中在 B 前有 . 的项。

L -> L. B 也是只有1条,我们往后移发现没有非终结符号了,那就不需要再继续添加其他式子了。

这个状态也不需要继续进行转移了。

接下来很关键,因为我们通过 State2 的 . 后的符号找出了 State 6 State 7 ,接下来还差符号 0 1 ,那么是否像之前一样按例添加状态呢, 答案是不是的 ,因为我们发现通过 0 1 找到的闭包集分别是 B -> 0 B -> 1 ,这与我们的之前的 State 4 State 5 相同。所以我们得将其整合起来,相当于 State 2 通过 0 1 符号找到了 State 4 State 5 状态。

2.3 第三次遍历

回头看第二次遍历,可以看出只有 State 6 可以进行状态转移了。

那么就将 State 6 作为第三次遍历的源头,可以看出 . 之后的符号有 L B 0 1 。

State 8 是由 State 6 通过 L 转移到这里的,所以我们找出所有 State 6 在 L 前有 . 的项。

S -> L· .L L -> . LB 有两条式子,往后移发现有非终结符号 B ,所以经过整合可以得到

可以看出 . 的后面还有一个符号,所以这里我们还得再进行一次遍历。

接下来,又是遇到重复的包的情况,可以看出我们由 State 6 通过 B 0 1 得到的闭包分别是 L->B B->0 B->1 ,很明显,这分别对应于 State 3 State 4 State 5 。

第三次遍历也就结束了。

2.4 第四次遍历

回看第三次遍历,可以看出只有 State 8 可以进行状态转移,其 . 之后的符号分别是 B 0 1 。

诶,感觉很熟悉,就是上面几行刚说的情况,也就是说通过这三个符号找到的闭包是我们之前遇到的状态,分别是 State 3 State 4 State 5 。

做到这里,我们发现我们已经全部遍历完毕!

总共有8个状态,通过以上流程做成个图是什么样子的?来看看!

这么一看就很清晰明了了,我们就可以通过这个图做出我们的 LR分析表

其实就是我们之前呈现的表

在状态 I2 和 I8 中,既有 移入 项目,也有 规约 项目,存在 移入 - 规约的冲突 ,所以不是 LR(0) 文法,但是因为 FOLLOW(S) {0, 1} = ∅,所以可以用 FOLLOW 集解决冲突,所以该文法是 SLR(1) 文法。

上表我们发现还有 r1,r2,r3 等。这个其实就是代表状态停止转移时为 第几条表达式 ,r3代表第三条表达式 L -> LB 。

当我们构建了表之后,我们如何运用起来呢?

下面我们通过一个例子来说明

以上字符串是如何被SLR分析器识别的呢?

热点内容
python安卓版 发布:2025-09-16 23:01:04 浏览:820
码小易编程 发布:2025-09-16 23:00:56 浏览:332
在线音乐源码 发布:2025-09-16 22:57:39 浏览:681
api开发php 发布:2025-09-16 22:06:15 浏览:596
mysql自动备份linux 发布:2025-09-16 21:58:33 浏览:943
怎么用自己的服务器ip做域名 发布:2025-09-16 21:49:57 浏览:916
vc为什么能编译不能用 发布:2025-09-16 21:48:03 浏览:743
编译原理冲突图的定义 发布:2025-09-16 21:26:45 浏览:811
安卓手机芯哪个牌子好 发布:2025-09-16 21:26:33 浏览:209
centos编译安装git 发布:2025-09-16 21:19:55 浏览:977