编译原理-递归下降分析器

本文详细介绍了编译原理中的递归下降分析法,包括其工作原理、准备知识如First集、Follow集和Select集的计算,并提供了一个简单的文法示例和C语言的程序实现,帮助读者理解如何构建不带回溯的LL(1)分析程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译原理-简单的递归下降语法分析器LL(1)

在网上看了很多篇关于递归下降分析器的博文,均没有满意的,一是所写的程序不对、二是解释的不够清楚。所以想自己写一篇,顺便总结一下所学。

递归下降分析法

递归下降分析法的原理是利用函数之间的递归调用来模拟语法树自上而下的构建过程。从根节点出发,自顶向下为输入串中寻找一个最左匹配序列,建立一棵语法树。在不含左递归和每个非终结符的所有候选终结首字符集都两两不相交条件下,我们就可能构造出一个不带回溯的自顶向下的分析程序,这个分析程序是由一组递归过程(或函数)组成的,每个过程(或函数)对应文法的而一个非终结符。

准备知识

对文法中的每一个非终结符计算它们的Fisrt集,Follow集和Select集。感觉书上的定义是真的难理解,下面不贴定义和数学符号,仅贴博主个人的理解。

  • 计算First集
    1. 终结符的First集是它本身;
    2. 若非终结符A可以推出以终结符开头的串,那么这个终结符属于
    Fisrt(A);若A可以推导出空串ε,那么空串ε属于First(A);
    3. A->B… 是一个产生式,B是一个非终结符,那么First(B)中除去空串ε都包含在First(A);
    4. 若A是非终结符;B1,B2,…,Bi 也是非终结符,且有产生式 A->B1 B2 … Bn;当B1,B2 … Bn-1都能推导出ε时,则First(B1)、FIRST(B2)、…、First(Bn-1)的所有非空元素和First(Bn) 包含在First(A)中;
    5. 若4中B1,B2 … Bn都能推导出ε时则First(B1)、FIRST(B2)、…、First(Bn)的所有非空元素包含在First(A)中,并且ε属于First(A)。
  • 计算Follow集
    Follow集合,顾名思义,就是文法符号后面可能跟随的终结符的集合(不包括空串ε)。Follow集针对的是非终结符。
    1. 首先设 S 为文法中开始符号,把 {#} 加入Follow(S)中;
    2. 若A->αBβ 是一个产生式,则把First(β)的非空元素加入
    Follow(B)中。如果β能够推导出ε则把Follow(A)也加入Follow(B)中,以此类推。
  • 计算Select集
    给定上下文无关文法的产生式A->α,A是非终结符, 若α不能推导出ε,则Select(A->α)=First(α); 如果α能推导出ε,Select(A->α)=(First(α) –{ε})∪Follow(A)。
示例

文法G:
E->TE’
E’->+E|ε
T->FT’
T’->T|ε
F->PF’
F’->*F’|ε
P->(E)|a|b|v
经过计算的Select集为:
Select(E-

递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验说明 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 三、实验要求 (一)准备: 1.阅读课本有关章节, 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC (4)C->e|dc 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串:在此位置输入符号串例如:eadeaa# (3)输出结果:eadeaa#为合法符号串 注意: 1.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 2.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 (四)程序思路 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值