函数式编程思想及其解释器的实现

前言

函数表达式在Excel中有着非常重要的作用,excel的公式就是一种基于函数的表达式,但公式中支持诸如“+”、“-”等运算符。纯函数表达式应该只包含函数和参数。遵循这种思想我们可以将数学上的中缀表达式”(56-9)*3+1/6”使用函数的方式来表示:

ADD(MULTIPLY(MINUS(56,9),3),DIVIDE(1,6))

即每一种运算符都可以抽象为一个函数(比较类似于前缀表达式),这就是函数式编程思想。在函数式编程中,函数起到了决定性的作用,目前有很多著名的函数式编程语言(如LISP、F#),这里我要使用C#实现一个自己的函数式编程语言,在本文中,我将只实现“+”、“-”、“*”、“/”四个操作符函数。

基本思想

我们知道,每种语言都具有它自身的语法,我在这里实现的语言(我这里将其命名为PureF)的语法非常简单,它由函数名、数值、“(”、“)”、“,”这几种元素构成,于是我可以用Token来表示每种元素,后面我还将实现其Tokenizer(分词器)。下图为Token结构体:

对于上面例子中的函数表达式,我们可以构建它的AST(抽象语法树):


从图中可以看到,一个函数的参数也可以是一个函数,通过这种嵌套性,我们可以实现一些复杂的运算。

通过对语言元素进行文法分析,我们需要建立语言中存在的两种表达式:函数表达式、值表达式,函数表达式表示了一个函数的函数名及其参数列表,而值表达式则表示一个数值(我这里只先实现整数类型)。

使用这两种表达式,我们就可以建立语法树了。

在得到语法树后,触发根元素的计算方法,通过递归可以将所有参数计算为数值,最终求解。

解释器实现

首先解释几个概念:

1.      

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值