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

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

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

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

没关系,因为它们($$,$ 1,$ 2)都加倍了。但是我想使用gmp精度库(例如,使用1000个小数位)来构建更好的计算器。因此,$$,$ 1和其他项现在不会翻倍,我需要将+ /-/ sin / exp更改为其gmp对应项。我该怎么办?

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

最佳答案

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

09-11 19:59
查看更多