LL文法讲解之二Follow集的计算

FOLLOW集的那些事儿一、学习FOLLOW集运算的重要性(男生必看)mm说:“我爱你。”他脸红了,他不想害她:“我没钱,更没有房子和车。”mm盯着他的眼睛:“我知道。”“我的月薪只有一千五。”mm的目光仍然坚定无比:“以后会多的。”他用颤抖的双手拿出一支烟叼在嘴上:“我每天要抽一包烟,一喝酒就闹事。”mm笑了,“以后有我在,你放心。”他的脊梁上冒起一阵寒意,结结巴巴地对她说:“其实……其实我很流氓……幼儿园就喜欢去女厕所,小学就没了初吻,中学就……”mm没等他说完就软在了他的怀里,声音细若蚊鸣:“早知道你好色,你老偷偷瞄我…”他抱紧了mm,温热娇小的身体让他热血沸腾。这时他忽然想到了一件很重要的事情,他决定把这事告诉mm......五秒钟后mm抬头问他:“真的?”他决然地点点头。mm沉默片刻挣开他的怀抱抬手给了他一个耳光,她愤怒地朝他喊道:“你丫竟然不懂编译原理中的FOLLOW集!”二、为什么需要FOLLOW集运算在开讲之前,吾先假设汝应该而且必须已经明白了FIRST集的作用—帮助编译器在语法分析时无回溯、敏捷高效、一键式地挑选用来替换某个非终结符的多个候选式中的一个。所以,FIRST集的思想对于建设一个和谐的语法分析器是多么的重要啊!(摘自<万老师学编译>之“FIRST集,他好我也好,耶!”)但是科学的发展观告诉我们花无百日好,人无完人,FIRST集也有其自身的制约,那就是,对于包含ε的候选式不能用FIRST来说明何时用ε来替换。补充说明:在文法中,如果某个非终结符的候选式是ε,就说明该非终结符代表的语法成分在句子中是可选的(可有可无,不是必须得)。例如,如下的文法试图刻画一个最简单的C文法(蓝色标注的是终结符):<C程序>→<预处理><函数><预处理>→#include<<文件名>><函数>→void<标识符>(){}…………以上文法有个缺点:就是按其描述,我们所写的C程序中必须有<预处理>部分,但实际上预处理语句是可有可无的,所以我们这样改写以上文法:<C程序>→<预处理><函数><预处理>→#include<<文件名>>|ε<函数>→void<标识符>(){}…………这样,对于以上文法,如果我们只用每个候选式的FIRST集来指导语法分析器进行无回溯的语法分析就行不得也哥哥。举例说明如下:现在需要分析以下句子(实际上就是一个完整的C代码)是否符合文法:#include<stdio.h>voidmain(){}首先,从非终结符<C程序>开始替换,必然是用<预处理><函数块>来替换<C程序>,因为我们没有其他选择。对于替换得到的句型<预处理><函数块>,按最左替换,我们下一步的任务是选择<预处理>的哪个候选式来替换?这时就是FIRST集的showtime了,语法分析器会向这两个候选式的FIRST集求助,显然,因为候选式#include<<文件名>>的FIRST集包括当前要分析的句子的首单词#,所以我们选择候选式#include<<文件名>>去替换<预处理>,哈哈,soeasy。但是,如果我们要分析的是以下句子呢(缺预处理语句)?voidmain(){}首先,从非终结符<C程序>开始替换,用<预处理><函数块>来替换<C程序>,得到的句型<预处理><函数块>,按最左替换,我们下一步的任务是选择<预处理>的哪个候选式来替换?只有继续借助于FIRST集了。因为候选式#include<<文件名>>的FIRST集是{#},不包括当前要分析的句子的首符号;而候选式ε的FIRST集是{ε},也不包括当前要分析的句子的首符号void,所以,voidmain(){}不是正确的句子。咦,貌似不对啊,明明我们可以这样替换的:将<预处理>替换为ε,这样我们得到句型<函数>,然后再将<函数>用候选式void<标识符>(){}替换就能证明句子voidmain(){}是符合文法的。这说明对于候选式为ε的情况,其FIRST集{ε}无法帮助语法分析器挑选正确的替换候选式。所以,我们应该针对候选式为ε的情况,特事特办。就本例来说,我们是否应该将<预处理>用其ε候选式进行替换,有两种办法:其一,因为<预处理>肯定不能用其#include<<文件名>>这条候选式进行替换,这是必死无疑的(因为这种替换只会得到以#起始的句子),所以我们姑且用ε候选式替换<预处理>,如果后续的推导得不到要分析的句子,则说明在这一步的替换也是不正确的,从而说明要分析的句子不正确。咦,这种方法怎么这么...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

确认删除?