基于VC的LL语法分析器设计和实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

基于VC++LL(1)语法分析器设计和实现

作者姓名:晏丽智指导老师:王一宾

摘要:语法分析是编译过程关键部分,能够粗略分为自上而下分析法和自下而上分析法。LL(1)文法是一类能够进行确定自上而下语法分析文法。本文首先叙述了LL(1)文法基础理论,然后着重讨论了LL(1)语法分析器设计,最终用VC++实现了LL(1)语法分析器。

关键词:LL(1)文法,FIRST集,FOLLOW集,估计分析表

0引言

语法分析是编译过程关键部分,它任务是在词法分析识别出单词符号串基础上,分析并判定程序语法结构是否符合语法规则。LL(1)文法是一类能够进行确定自上而下语法分析文法。本文讨论了LL(1)语法分析器工作原理和过程,关键说明了FIRST集、FOLLOW集和估计分析表结构。

1LL(1)语法分析器基础理论

1.1理论基础

语法分析是编译过程关键部分,它任务是在词法分析识别出单词符号串基础上,分析并判定程序语法结构是否符合语法规则。语法分析器工作本质:按文法产生式,识别输入符号串是否为一个句子,判定是否能从文法开始符号出发推导出这个输入串。LL(1)文法是一类能够进行确定自上而下语法分析文法。自上而下分析方法基础思想是从文法开始符号出发,向下推导,推出句子;即对任何输入串,试图用一切可能措施,从文法开始符号出发,自上而下地为输入串建立一棵语法树[1]。实现这种自上而下分析法存在很多困难,首先是递归问题,一个文法是含有左递归,假如存在非终止符P,有PPa,则含有左递归文法将使上述自上而下分析过程陷入无限循环。所以,使用自上而下分析法必需消除文法左递归。其次是回溯问题。因为回溯造成匹配虚假现象,把已经做一大堆语义工作推倒重来。这些事情既麻烦又费时间,所以,最好应设法消除回溯。

1.2左递归消除

直接消除见诸于产生式中左递归是比较轻易。假定相关非终止符P规则为?P→Pα|?

其中,?不以P开头。那么我们能够把P规则改写为以下非直接左递归形式:

P→?P’

P’→αP’|ε(ε为空字)

这种形式和原来形式是等价,也就是说,从P推出符号串是相同。

通常而言,假定相关P全部产生式是

P→Pα1|Pα2|…|Pαm|β1|β2|…βn

其中α全部不等于ε,且每个β不以P开头。

则改写后为P→β1P′|β2P′|…|βnP′

P′→α1P′|α2P′|…|αmP′|ε

使用这个方法,我们轻易把见诸于表面全部直接左递归全部消除掉,也就是说,把直接左递归全部改成直接右递归。对于间接左递归消除能够采取代人法把间接左递归变成直接左递归[2]。

下面给出消除左递归算法:

假如一个文法不含回路,也不含以ε为右部产生式。

(1)排序

把文法G全部非终止符按任一个次序排列P1、P2、…、Pn按序实施。

(2)代入及消除左递归

for(i=1;i=n;i++)

for(j=1;j=i-1;j++)

把形如Pi→Pjγ规则改写为

Pi→δ1γ|δ2γ|…|δkγ

(其中Pj→δ1|δ2|…|δk是相关Pj全部规则)

消除相关Pi规则直接左递归性

(3)化简

化简由(2)所得文法,即去除那些从开始符号出发永远无法抵达非终止符产生式规则。

1.3消除回溯、提左因子

为了消除回溯就必需确保:对文法任何非终止符,当要它去匹配输入串时,能够依据它所面临输入符号正确地指派它一个候选去实施任务,而且次候选工作结果是确信无疑。也就是说,若此候选择得成功匹配,那么,这种匹配不会是虚假;若此候选无法完成任务,则任何其它候选也肯定也无法完成任务。换句话说,假定现在轮到非终止符A去实施匹配任务,A共有n个候选α1,α2,……αn,即A→α1|α2|……αn。A能够依据不一样输入符号指派对应αi作为全权代表去实施任务,那就肯定无需回溯了。在这里A已不再是让某个候选去试探地实施任务,而是依据所面临输入符号α正确地指派唯一一个候选。其次,被指派候选工作成败也完全代表了A[3]。

假定相关A规则是A→δβ1|δβ2|……|δβn|γ1|γ2|……|γm(其中γi不以δ开头),提取公共左因子,改写为

A→δA′|γ1|γ2|……|γm

A′→β1|β2|……|βn

2LL(1)语法分析器设计

首先判别一个文法是否是LL(1)文法,假如不是LL(1)文法则需要转化为LL(1)文法。要判别一个文法是否为LL(1)文法,首先需要给出FIRST集合、FOLLOW集合。

2.1结构FIRST集

依据定义:FIRST(α

文档评论(0)

a105776456 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档