自己动手制作C 语言编译器(4):递归下降

本文介绍如何使用递归下降方法实现C语言编译器的四则运算语法分析器。通过BNF范式解释终结符与非终结符,详细阐述四则运算的递归下降解析过程,解决左递归问题,并展示具体的代码实现。
摘要由CSDN通过智能技术生成

本章我们将讲解递归下降的方法,并用它完成一个基本的四则运算的语法分析器。

什么是递归下降

传统上,编写语法分析器有两种方法,一种是自顶向下,一种是自底自上。自顶向下是从起始非终结符开始,不断地对非终结符进行分解,直到匹配输入的终结符;自底向上是不断地将终结符进行合并,直到合并成起始的非终结符。

其中的自顶向下方法就是我们所说的递归下降。

终结符与非终结符

没有学过编译原理的话可能并不知道什么是“终结符”,“非终结符”。这里我简单介绍一下。首先是BNF范式,就是一种用来描述语法的语言,例如,四则运算的规则可以表示如下:

<expr> ::= <expr> + <term>

         | <expr> - <term>

         | <term>

 

<term> ::= <term> * <factor>

         | <term> / <factor>

         | <factor>

 

<factor> ::= ( <expr> )

           | Num

用尖括号<>括起来的就称作非终结符,因为它们可以用::=右侧的式子代替。|表示选择,如<expr>可以是<expr> + <term>、<expr> - <term>或<term>中的一种。而没有出现在::=左边的就称作终结符,一般终结符对应于词法分析器输出的标记。如果想一起交流的可以加这个群:941636044 ,有什么问题可以群里面交流,群里面也有一些方便学习C语言C++编程的资料可以给你利用哦!

四则运算的递归下降

例如,我们对3 * (4 + 2)进行语法分析。我们假设词法分析器已经正确地将其中的数字识别成了标记Num。

递归下降是从起始的非终结符开始(顶),本例中是<expr>,实际中可以自己指定,不指定的话一般认为是第一个出现的非终结符。

1. <expr> => <expr>

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值