【摘要】:递归下降分析程序由一组子程序组成,每个非终结符对应一个子程序。非终结符相应产生式的右部展示了子程序代码的结构,子程序的函数体依据候选式中的各个符号完成工作。这样一组子程序组合起来,实现的自上而下分析过程,称为递归下降分析法。如果所有非终结符都展开为终结符并得到匹配,分析成功结束;否则,表明输入符号串有语法错误。一个递归下降分析程序能正确工作的必要条件是其源文法是LL文法。
递归下降分析程序由一组子程序组成,每个非终结符对应一个子程序。非终结符相应产生式的右部展示了子程序代码的结构,子程序的函数体依据候选式中的各个符号完成工作。由于文法通常是递归定义的,因此子程序也是递归的。这样一组子程序组合起来,实现的自上而下分析过程,称为递归下降分析法。
递归下降分析过程的调用,从文法开始符号对应的子程序入手,遇到终结符时进行输入串中符号的匹配工作,遇到非终结符就调用相应非终结符的子程序。如果所有非终结符都展开为终结符并得到匹配,分析成功结束;否则,表明输入符号串有语法错误。
例如,考虑文法(G4.1)中F的产生式
F→(E)|i
递归下降分析法(www.xing528.com)
当F面临的下一个输入符号是“(”时,就应当使用第一个候选式完成识别工作;面临变量时就应当使用第二个候选式;而当面临任何其他输入符号时,则表明输入串出现了语法错误。根据这一原则,设计一个与文法符号同名的函数完成识别工作,代码如下所示。函数match用于进行输入符号的匹配工作。其中,sym是词法分析器给出的当前单词符号,getSymbol的功能是取下一单词赋予sym。单词符号采用了3.1节表3-1中的编码。
但是,为非终结符号E编写分析程序不像F的一样简单。E的产生式是左递归形式E→E+T|T。依据左递归文法编写的程序在执行时将陷入无限循环。
一个递归下降分析程序能正确工作的必要条件是其源文法是LL(1)文法。对一个LL(1)文法,可以构造一个不带回溯的自上而下的语法分析程序。如果能用某种高级语言写出所有的子程序,那就可以用这个语言的编译系统来产生整个分析程序。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。