- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
自顶而下语法分析(PT)
前言
对于国内的计算机教材,我一直是有巨大看法的,以至于写了「 HYPERLINK /blog/page/readgoodcsbooks/ 读优秀的计算机教材」来泄愤(/blog/page/readgoodcsbooks/),当然骂完之后总要做一些什么事儿,不能「听得风就是雨」,于是我把斯坦福大学教授语法分析技术时用的教材《Parsing Techniques》中关于「表驱动的自顶而下语法分析」部分做了中文翻译,它正好对应合肥工业大学同门课程的实验二,提前说明,全文近7000汉字却没有一行代码,按这本书的说法是照顾斯坦福大学人文艺术学院的学生。
良好的讲述就是艺术,不是么?
当然,我的英语和汉语水平都不是很理想,所以在表意上定会有所折损,如果你对英文更有兴趣,请自行检索《PT》的电子版,这段内容在第九章,如果你发现有所错漏或表意不明之处,希望能帮助修订,感谢。
下面,我们开始。
查表法
首先我们要考虑一个简单的语法格式来限制搜索情况,在这种语法格式内,推导式的右部都由一个终结符开始。在这种语法格式下,预测步骤后面总是紧跟着一个匹配步骤,匹配步骤尝试匹配[下一个输入的标示符]与我们[在预测过程所选中的推导式的右侧的第一个字符],只有在推导式右部是以输入字符开始时匹配才得以成立,而针对其他的右侧推导式将会失败。我们可以利用这一现象去限制我们所作出预测的数量:对于一个以某个终结符开始的推导式右部,只有当其首个字符与输入字符相等时,它才会被考虑加入预测集合。比如,考虑图表8.1中的语法:
我们使用广度优先搜索,同时结合刚才的观察进行分析。
图(a)表示这个自动机的开始,我们将#作为终结符添加到初始预测和输入字符串的末尾。在`S`的右部中,只有一个是以`a`开头的(`aB`),所以这是唯一匹配的右部。我们选择了S 的第一个 aB,故而用 S1 表示,放到左边。
图(b)中我们直接匹配a,将a放到左面。
图(c)中,下一个输入的符号又是a,在B的右部中,我们发现只有aBB能匹配成功。把B3放到左面,我们得到图(d)。
图(d)中,直接匹配a,得到图(e)。
图(e)中,我们能观察到下一个输入的字符是b,这一次有两个B的右部能够匹配成功(b,bS),我们就针对两种情况生成两行,得到图(f),同样我们把b都移向左侧,得到(g)。
图(g)中,下一个输入的字符是b。匹配第一行,B右部中的 b和bS可以满足要求;匹配第二行,S中的bA可以满足要求。把B 和 S 分别用这三个可以匹配的右部替换并放到左边,得到图(h),匹配b,得到图(i)。
图(i)中,我们能发现,只剩下一个我们最初添加的#作为终止符号了,而S和AB不能再匹配成功,因此,下面两行预测走到了死胡同,只给我么留下了唯一的预测,得到图(j)。
我们能够再一次提高上述方法的效率,那就是我们为每一对终结符与非终结符符的组合找到能使他们匹配的右部,就像刚才我们所寻找的那样,找到后将他们填入表单中。针对图表8.1中的语法,我们可以制作像图表8.3一样的表格,它被叫做 parse table
其实怎样构造这样一个表是需要我们着重考虑的。而一旦这样的表格被建立起来,接下来的行动就好办了。我们所创造的这个语法分析器将不再需要上面定义的语法推导式,取而代之的是在每一次预测时,语法分析器用下一个输入的字符和需要匹配的非终结符作为这个表格的两个索引,查找到对应的格子,格子里存着的就是我们需要考虑的推导式的右部。比如,在图表8.2(e)中,句法分析器将会用
输入字符b和非终结符B去确定他需要考虑的推导式右部B1和B2.如果对应的格子是空的,我们就发现这个输入是不符合语法的。
这还没有结束,前面格子里只有一个右部,而在[A,a]与[B,b]对应的各自内有不止一个元素,所以我们仍需要搜索决定哪一个符合语法。
LL(1)语法分析
在上一小节里我们举例的从上至下的语法分析器,其中最大的限制是我们要求语法中非终结符的右部都以一个终结符开始。而在这一节中,我们将去掉这个限制条件。你会看到,我们仍然可以建立一个parse table。甚至,是带有ε边的。
不带有ε规则的语法分析
如果语法不带有ε规则,也就是说没有非终结符可以推导出一个空字符串。换句话说,每一个非终结符最终至少都能导出长度为1的字符串,这对每一个右部来说也成立。由此来说,由终结符开始的字符串就是我们所关注的对象。对于任意一个右部,一旦我们知道了它最后推导出来的字符串由哪一个字符开始,我们就能像上面那样构造一个parse table。所以,我们需要计算出每一个右部对应的字符串的首个终止字符的集合。
FIRST1 集合
这些由终止符构成的集合被我们叫做” FIRST1 集合”:假设我们拥有一个非空左部x,那么FIRST1 (x)
文档评论(0)