Context-free Grammar的编译器设计和实现-与某同学问答
已重写的文章在(编译原理(前端)的算法和实现)(2023年6月24日)
我在准备重写本文的内容,本文不必再看。(2023年3月25日)
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 |
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>; |
有些问题想请教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 |
有些问题想请教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 |
有些问题想请教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 |
有任何问题或者要代码的同学可以我的博客http://bitzhuwei.cnblogs.com留言,上面有我其它联系方式,欢迎骚扰~
![]() |
微信扫码,自愿捐赠。天涯同道,共谱新篇。
微信捐赠不显示捐赠者个人信息,如需要,请注明联系方式。 |