将用户定义的函数添加到简单的计算器YACC

时间:2017-01-21 16:54:48

标签: function calculator yacc lex

我一直在互联网上搜索一个可理解的例子,说明如何在一个简单的计算器解释器中定义和调用函数。也许我已经找到了答案,但由于我不熟悉YACC,我无法看到它。

所以问题是,如何为用户定义的函数设置符号表,以及如何在计算器解释器中存储/调用这些函数?

我基本上希望实现这样的目标:

def sum(a,b) { a + b }

sum(5,5)

结果:

10

任何指针或示例都将不胜感激

1 个答案:

答案 0 :(得分:0)

这肯定潜入了解释(或编译)编程语言所需的概念,这使得难以以适合StackOverflow的格式提供答案。这是一个快速概述:

  1. 您需要一个可以包含函数和变量的符号表。或两个符号表。在第一种情况下,映射的值将是某种变体类型,例如区分联合;如果你有多种类型的变量,你可能还需要它。在第二种情况下,您可以使用特定类型作为函数名称的映射值。我选择了第一个选项,因为它允许函数成为一流的对象。

  2. 您需要某种类型来表示"值"功能定义。显而易见的类型是表达式(或程序)的Abstract Syntax Tree(AST),这样做通常会简化您的代码,因此我强烈推荐它。这意味着计算器/解析器实际上不会评估5+5(即使这是文字输入)或a+b,而是将AST返回给任何调用解析器的人。因此,您需要:

  3. 可以评估AST的功能。这通常很容易写,因为它只是一个深度优先的树步行。但现在你需要担心variable scope,因为当你评估它们的函数体sum时,你可能只希望在本地设置参数的值。

  4. 如果你完成了所有这些工作,那么你将比通常的步骤更进一步......让我们用flex和bison构建一个计算器"项目,我绝对鼓励你这样做。您可能需要查看经典文本Structure and Interpretation of Computer Programs(Abelson& Sussman,1996;通常简称为SICP)。