前言
函数表达式在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.