将用户定义的函数添加到简单的计算器 YACC
Adding user defined functions to a simple calculator YACC
我一直在整个 Internet 上搜索一个易于理解的示例,说明如何在简单的计算器解释器中定义和调用函数。也许我找到了答案,但由于我不熟悉 YACC,所以看不到它。
所以问题是,如何为用户定义函数设置符号 table 以及如何在计算器解释器中 store/call 这些函数?
我基本上是想实现这样的目标:
def sum(a,b) { a + b }
sum(5,5)
结果:
10
如有任何指点或示例,我们将不胜感激
这绝对是深入了解解释(或编译)编程语言所需的概念,这使得很难以 suitable 格式为 Whosebug 提供答案。这是一个简要概述:
你需要一个符号table,它可以同时包含函数和变量。或者两个符号tables。在第一种情况下,映射值将是某种变体类型,例如可区分的联合;如果您有不止一种类型的变量,您可能仍然需要它。在第二种情况下,您可以为函数名称的映射值使用特定类型。我会选择第一个选项,因为它允许函数成为 first-class 对象。
您需要某种类型来表示函数定义的 "value"。显而易见的类型是表达式(或程序)的 Abstract Syntax Tree (AST),这样做通常会简化您的代码,所以我强烈推荐它。这意味着 calculator/parser 不会实际评估 5+5
(即使这是文字输入)或 a+b
,而是 return 一个 AST 给任何调用解析器的人。因此,您将需要:
一个可以计算 AST 的函数。这通常写起来很简单,因为它只是一个 depth-first 树遍历。但是现在您需要担心 variable scope,因为当您评估函数体 sum
时,您可能只想在本地设置参数值。
如果您管理所有这些,您将比通常的 "let's build a calculator with flex and bison" 项目更进一步,我绝对鼓励您这样做。您可能想看看经典文本 Structure and Interpretation of Computer Programs(Abelson & Sussman,1996;通常简称为 SICP)。
我一直在整个 Internet 上搜索一个易于理解的示例,说明如何在简单的计算器解释器中定义和调用函数。也许我找到了答案,但由于我不熟悉 YACC,所以看不到它。
所以问题是,如何为用户定义函数设置符号 table 以及如何在计算器解释器中 store/call 这些函数?
我基本上是想实现这样的目标:
def sum(a,b) { a + b }
sum(5,5)
结果:
10
如有任何指点或示例,我们将不胜感激
这绝对是深入了解解释(或编译)编程语言所需的概念,这使得很难以 suitable 格式为 Whosebug 提供答案。这是一个简要概述:
你需要一个符号table,它可以同时包含函数和变量。或者两个符号tables。在第一种情况下,映射值将是某种变体类型,例如可区分的联合;如果您有不止一种类型的变量,您可能仍然需要它。在第二种情况下,您可以为函数名称的映射值使用特定类型。我会选择第一个选项,因为它允许函数成为 first-class 对象。
您需要某种类型来表示函数定义的 "value"。显而易见的类型是表达式(或程序)的 Abstract Syntax Tree (AST),这样做通常会简化您的代码,所以我强烈推荐它。这意味着 calculator/parser 不会实际评估
5+5
(即使这是文字输入)或a+b
,而是 return 一个 AST 给任何调用解析器的人。因此,您将需要:一个可以计算 AST 的函数。这通常写起来很简单,因为它只是一个 depth-first 树遍历。但是现在您需要担心 variable scope,因为当您评估函数体
sum
时,您可能只想在本地设置参数值。
如果您管理所有这些,您将比通常的 "let's build a calculator with flex and bison" 项目更进一步,我绝对鼓励您这样做。您可能想看看经典文本 Structure and Interpretation of Computer Programs(Abelson & Sussman,1996;通常简称为 SICP)。