Context-free Grammar的编译器设计和实现-与某同学问答

时间:2023-02-06 22:32:41

Context-free Grammar的编译器设计和实现-与某同学问答

本文来自与某不认识的同学的QQ聊天问答记录,但愿能帮到看了我写的制作编译器的文章却看不懂的同学。

本文的发布得到了“有些问题想请教”同学的同意和支持,在此表示感谢!

PS:那些加粗的文字不是我加粗的啊!WLW是怎么回事!还是来这里下载PDF版看吧,格式好一点。

有些问题想请教9:15:17

你好~

null9:15:21

你好

null9:15:26

怎么称呼?

有些问题想请教9:15:51

额,你叫我有些问题想请教就行了~

有些问题想请教9:16:07

我最近在做编译原理的实验课作业~然后~~不会啊。。

有些问题想请教9:16:22

想问一下怎么从LL1分析表创建语法树。。

null9:17:14

这个问题太长了

null9:17:20

你看我的博客了没

有些问题想请教9:17:20

额。。。

有些问题想请教9:17:50

看了。。发现不是太懂。。

null9:18:28

LL1分析表的结构能理解了吗

有些问题想请教9:25:35

恩这个能

有些问题想请教9:28:12

但是不太理解LL1分析表和语法树的关系。。

null9:28:27

Context-free Grammar的编译器设计和实现-与某同学问答

null9:28:31

看这一节

null9:29:17

建议从理解Expression的语法树开始

null9:31:16

文法能理解吗?

有些问题想请教9:31:53

额,能。。

有些问题想请教9:31:58

正在努力看。。

null9:32:12

那是能还是不能?

有些问题想请教9:32:32

能。。。

null9:32:38

你那有表达式的文法吧?

null9:32:39

就是这个

null9:32:39

<Expression> ::= <Multiply> <PlusOpt>;
<PlusOpt> ::= "+" <Multiply> | "-" <Multiply> | null;
<Multiply> ::= <Unit> <MultiplyOpt>;
<MultiplyOpt> ::= "*" <Unit> | "/" <Unit> | null;
<Unit> ::= number | "(" <Expression> ")";

有些问题想请教9:33:58

这个能看懂。。不过跟书上有点不一样

null9:34:17

哪里不一样?

有些问题想请教9:34:43

额这个没关系啦,它就是叙述方式有点不一样。。。

null9:34:54

结构要一样才对啊

null9:35:06

文法是一切的基础

有些问题想请教9:48:16

就。。其实我的意思是,现在有一段文法和一段程序,还有这个文法的各个First集和Follow集,LL1分析表,然后怎么画程序的语法树。。。

null9:49:14

画程序的语法树,有这段程序和LL1分析表就够了

null9:49:49

4.1 LL1分析过程

null9:49:53

这部分看不懂?

有些问题想请教9:50:36

再看一下。。。

null9:51:22

第一步是,假设程序没有语法错误,那么整个程序对应文法的起始结点

有些问题想请教9:51:36

null9:51:49

起始结点有1到多个候选式

null9:52:03

选择哪个候选式由LL1分析表决定

有些问题想请教9:52:23

诶这个起始结点指的是语法树的根结点?

null9:52:28

有些问题想请教9:52:32

恩恩

null9:52:44

根结点就代表整个程序

有些问题想请教9:52:47

null9:53:00

我还是以Expression为例吧

有些问题想请教9:53:04

null9:54:06

Expression作为根结点,【(19+18)*(19-18)】的第一个单词是"("

有些问题想请教9:54:18

null9:54:48

Expression这个语法树结点类型与"("这个单词类型在LL1分析表里对应的候选式是<Multiply><PlusOpt>

null9:55:06

所以Expression根结点就产生了Multiply和PlusOpt这两个叶结点

null9:55:11

不对,是子结点

有些问题想请教

9:55:23

恩恩

null9:55:43

然后就继续分析Multiply了

null9:56:16

Multiply这个语法树结点与"("在LL1分析表里对应的候选式是<Unit><MultiplyOpt>

有些问题想请教9:56:24

null9:56:29

所以Multiply产生了Unit和MultiplyOpt这两个子结点

null9:57:08

然后看Unit和"(",在LL1分析表里对应【"(" <Expression> ")"】这个候选式

null

9:57:34

所以Unit产生"("、<Expression>、")"这三个子结点

有些问题想请教9:57:43

null9:58:18

然后看"("这个语法树结点,正好就是"("这个单词类型,所以"("就处理好了,以后就处理"19"这个单词

null9:58:45

依此类推

null9:58:48

你就明白了吧

有些问题想请教9:58:58

所以“(”是叶节点了?

null9:59:04

null9:59:34

Context-free Grammar的编译器设计和实现-与某同学问答

有些问题想请教10:01:43

就是说每一个一直处理到出现处理不下去的叶节点就停止?

null10:01:53

有些问题想请教10:02:58

那根节点的子节点是Multiply和PlusOpt,刚才处理完了Multiply这一支,PlusOpt呢?

null10:03:01

"("这个语法树结点是终结符,所以就不再产生子结点,之前的Expression、Multiply等等都是非终结符

有些问题想请教10:03:14

恩这个我懂

null10:03:30

刚处理了"(",下面该Expression了

null10:03:35

新产生的那个Expression

null10:04:28

然后你会发现Expression处理完之后,应该处理")"了

null10:04:46

")"正好好Unit的")"终结符对应了

null10:05:55

现在Unit这个结点处理完了,往语法树上面看,Multiply这个结点也就处理完了,这时候才该处理MultiplyOpt

null10:09:27

MultiplyOpt和"*"这个单词类型,在LL1分析表里对应哪个候选式?

有些问题想请教10:11:55

应该是* <Unit>

null10:12:05

看你都学会了

null10:12:28

所以MultiplyOpt产生了“*”和Unit两个子结点

有些问题想请教10:13:29

可是为什么是查找MultiplyOpt和“*”而不是和别的呢。。

null10:14:14

因为前面已经处理掉了(19+18)*(19-18)里的(19+18)了

有些问题想请教10:14:35

恩,我再酝酿一下~

null10:14:43

Context-free Grammar的编译器设计和实现-与某同学问答

有些问题想请教10:15:25

哦意思就是说(19+18)这些叶节点都已经出现过了是么?

null10:15:29

有些问题想请教10:15:57

恩那我懂了~现在去做些练习。。

null10:16:02

加油

null10:17:47

对了这些聊天内容我能不能发到博客里?方便别人理解

有些问题想请教10:18:20

恩行~不过能不能把昵称涂掉。。

null10:18:28

没问题

null10:21:31

你是看了哪篇博客来问我的?

有些问题想请教10:23:41

http://www.cnblogs.com/bitzhuwei/archive/2013/06/05/CompilerDesignAndImp4Context-freeGrammar.html

有些问题想请教10:23:45

就这篇。。

null10:24:05

看来我写的太差,

有些问题想请教10:24:40

诶那个LL1分析表(3/3)里面的4是不是应该填在PlusOpt和“#”里面的呀?

null10:25:49

哎呀好像是哎

null10:26:29

谢谢你帮我挑错了

有些问题想请教10:26:39

Context-free Grammar的编译器设计和实现-与某同学问答不用~我该谢谢你才是~

有任何问题或者要代码的同学可以我的博客http://bitzhuwei.cnblogs.com留言,上面有我其它联系方式,欢迎骚扰~