0

我正在用 flex/bison 编写简单表达式的计算器,例如 5^(3+2-sin(15))。源代码可以在这里找到 - https://github.com/blueboar2/interval。例如,在 interval.y 中有这样的行:

| 经验 exp { $$ = exp($2); 结果 = $$; }

| LN exp { $$ = log($2); 结果 = $$; }

| SIN exp { $$ = sin($2); 结果 = $$; }

没关系,因为它们($$、$1、$2)都是双打的。但我想构建更好的计算器,使用 gmp 精度库(例如,小数点后 1000 位)。所以,$$、$1 和其他现在不是双倍的,我需要将 +/-/sin/exp 更改为他们的 gmp 对应项。我该怎么做?

我查看了 gmp 示例目录,其中存在此​​类计算器,但它们只是合并了一个堆栈(固定大小,原文如此),并将所有数字存储在那里。我不喜欢这种方法,部分原因是堆栈大小固定(需要 glib 来添加“增长”数组),部分原因是 $$ = exp($2) 比“从堆栈中取数,取幂,放入堆栈”要好得多.

4

1 回答 1

0

阅读 Bison/Yacc 文档,并查看%unionor YYSTYPE。如果您使用 Bison 3.0 或更高版本,请阅读http://www.gnu.org/software/bison/manual/html_node/Semantics.html.

于 2013-10-16T18:27:18.437 回答