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

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

编译原理-简单的递归下降语法分析器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’->

  • 5
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值