首页 > 其他 > 详细

编译器 阅读笔记

时间:2014-03-24 06:01:41      阅读:491      评论:0      收藏:0      [点我收藏+]

Syntax Analysis

         CFG

                  一个图样:

                          CFL(语言):可以用cfg描述的(字符串的集合)-->本质歧义性、语句是否符合文法。

                           |

                           | 一个语言可以对应多种语法

                           V

                          CFG(语法):

                                   production(构成语法的核心)--->可以对于每条prod定义语义(semantic)

                                   对于给定语句(字符串),可以用语法进行解析,最终结果为parse-tree

                                   LR(k)是语法的性质。(大部分性质都是语法的,后面会解释)

                                            解析过程--->left-most/right-most

                  PDA?

                          其实没有讲PDA,但可以看出后面的那个算法大致就是DPDA。

                  消除left-recursion

                          自动消除left-recursion可能会出现不合理的东西。(因为解析是语法相关的)

                  歧义性

                          语法歧义性:有串存在不同的parse-tree

                          语言歧义性:一般称为本质歧义性(inherent ambiguous)。该语言的任何语法均有歧义.

                  编译器要CFG做什么?

                          需要通过CFG定义的语义(semantic)来解析语句。

                                   语义:一般是指对于CFG中某个production,我实际应该做些什么。

                                            如后缀表达式就是输出后缀,三段码就是输出三段码。

                          通过这个目的可以看出,编译器使用CFG是语法相关的(grammer-independent)。

                                   如果只给你语言,只能判断一个语句(字符串)是否合法。

                                            而不能用之构建parse-tree,以及之后的解释(semantic)

                                   因此大部分编译器的讨论均涉及具体的语法。而不谈语言。

                                            (这个区别是很重要的,计算理论中比较喜欢谈语言而不是语法)

         Top-down

                  递归遍历的方法

                          涉及回溯。非确定(如果考虑pda即为nondeterministic)

                  LL(k)

                          通过后面的k个input,对当前行动作出判断。

                  LL(1)

                          First/Follow函数

                          parse-table

                          实现算法事实上是一个PDA。

         bottom-up

                  shift-reduce

                          涉及猜(nondeterminsitic).或者说回溯亦可。

                  LR(0)

                          这个是真正的"0"。构造出的GOTO甚至无法运行。

                          但collection和GOTO在后面会有用。

                  LR(1)

                          范式:

                                   state

                                   parse-table

                                            ACTION:terminal怎么办?决定reduce还是shift

                                            GOTO:nonterminal怎么办?决定reduce之后是什么

                                   remark(非核心内容):LR(1)的GOTO和LR(0)的GOTO不一样。

                                            LR(0):terminal/nonterminal  item-set

                                            LR(1):nonterminal                    state

                                            主要是概念上的区别吧。LR(1)中GOTO的部分职能交给了ACTION

                          SLR(1)

                                   一种parse-table的求法。

                                   (事实也包含了state的意义)

 

 

remark:关于LL和LR
  (left->right)读 + top-down--->决定left-most
  (right->left)读 + bottom-up--->决定right-most
  这两种方法均是为了将原语法直接生成的PDA。优化成类似DPDA。
    DPDA才是真正可预期的算法。但很多优秀的算法也是“非确定的“。如单纯形法。

编译器 阅读笔记,布布扣,bubuko.com

编译器 阅读笔记

原文:http://www.cnblogs.com/airsplay/p/3619885.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!