如何将$$,$ 1,$ 2 ... bison伪变量的类型更改为GMP变量

时间:2013-10-16 12:23:05

标签: c calculator bison flex-lexer gmp

我在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)比“从堆栈中获取数量,取指数,放入堆栈”要好得多

1 个答案:

答案 0 :(得分:0)

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