导航:首页 > 源码编译 > 怎样编译一个表

怎样编译一个表

发布时间:2025-07-09 06:54:23

编译原理——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分析器识别的呢?

㈡ 如何编译一个java文件

javac 用于编译Java文件,格式为:
java [options] [sourcefiles] [@files]
其中:
options:命令行选项;
sourcefiles:一个或多个要编译的源文件;
@files:一个或多个对源文件进行列表的文件,有时候要编译的文件很多,一个个敲命令会显得很长,也不方便修改,可以把要编译的源文件列在文件中,在文件名前加@,这样就可以对多个文件进行编译,对编译一个工程很有用,方便,省事。
有几个比较重要的选项:
-d 用于指定编译成的class文件的存放位置,缺省情况下不指定class文件的存放目录,编译的class文件将和源文件在同一目录下;
-classpath 可以简写成-cp,用于搜索编译所需的class文件,指出编译所用到的class文件的位置,如jar、zip或者其他包含class文件的目录,指定该选项会覆盖CLASSPATH的设定;
-sourcepath用于搜索编译所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目录;
需要注意windows下和linux下文件路径分隔符和文件列表(即-classpath和-sourcepath指定的文件)分隔符的区别:
windows下文件路径分隔符用 \ ,文件列表分隔符用分号 ;
linux下文件路径分隔符用 / ,文件列表分隔符用冒号 :

㈢ wps密码编译对照表在哪

文档加密中。wps密码编译对照表在文档加密中,需要使用WPS打开表格,点击左上角菜单栏“文件”选项,在文件展开菜单中依次点击“文档加密”,点开“加密文档”即可看到wps密码编译对照表。

㈣ Excel表格函数编程怎么编

函数编程?应该是自定义函数吧?下面为操作步骤:

1.Alt+F11,右键左上角空白处,插入模块

阅读全文

与怎样编译一个表相关的资料

热点内容
电视命令行 浏览:323
情侣头像医生和程序员 浏览:433
被加密的光盘系统无法读取 浏览:326
鬼泣巅峰之战怎么选择推荐服务器 浏览:737
ghostlinux下载 浏览:380
加密货币三大交易未来发展潜力 浏览:629
树洞app怎么看谁关注我 浏览:322
aapt编译某一个xml 浏览:470
解压助眠视频外国 浏览:905
程序员女朋友照片当壁纸 浏览:747
oracle备份压缩文件 浏览:134
云服务器摄像头一定要wifi吗 浏览:884
python编写加减乘车程序 浏览:699
python离线安装numpy 浏览:709
xplore解压软件怎么设置 浏览:990
ios反编译混淆代码查看 浏览:315
云计算优化算法 浏览:422
手机头条安装文件夹 浏览:580
网吧服务器怎么分配机子 浏览:826
什么是反编译程序器 浏览:32