基于VC++的LL(1)语法分析器设计与实现学号:070108109基于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´|ε使用这个方法,我们容易把见诸于表面的所有直接左递归都消除掉,也就是说,把直接左递归都改第1页共12页基于VC++的LL(1)语法分析器设计与实现学号:070108109成直接右递归。对于间接左递归的消除可以采用代人法把间接左递归变成直接左递归[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|……|γmA′...