我在flex / bison中编写简单表达式的计算器,如5 ^(3 + 2-sin(15))。源代码可以在这里找到 - https://github.com/blueboar2/interval。例如,在interval.y中有这样的行:
| EXP exp {$$ = exp($ 2); result = $$; }
| LN exp {$$ = log($ 2); result = $$; }
| SIN exp {$$ = sin($ 2); result = $$; }
一切都好,因为所有这些($$,$ 1,$ 2)都是双打。但我想建立更好的计算器,使用gmp精度库(例如,1000个小数位)。因此,$$,$ 1和其他人现在不是双打,我需要将+ / - / sin / exp更改为他们的gmp对应物。我怎么能这样做?
我查看了gmp示例目录,其中存在这样的计算器,但它们只是合并了一个堆栈(固定大小,sic),并存储了所有数字。我不喜欢这种方法,部分原因是固定大小的堆栈(需要glib来添加“增长”数组),部分原因是因为$$ = exp($ 2)比“从堆栈中获取数量,取指数,放入堆栈”要好得多
答案 0 :(得分:0)
阅读Bison / Yacc文档,查看%union
或YYSTYPE
。如果您使用的是Bison 3.0或更高版本,请阅读http://www.gnu.org/software/bison/manual/html_node/Semantics.html
。