我正在用 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) 比“从堆栈中取数,取幂,放入堆栈”要好得多.