【发布时间】:2013-12-18 23:37:14
【问题描述】:
我正在编写一个 bison/flex 解析器,它有多种数据类型,都与 ANSI C 兼容。它不是 C 语言,但会保留它的数据类型。 问题是...我不确定如何正确执行此操作。
例如,在一个表达式中,比如 'n1' + 'n2',如果 'n1' 是 double 而 'n2' 是 32 位整数,我需要进行类型转换,对吗?如何正确执行? 也就是说,我在逻辑上需要评估哪个类型更大(这里是双精度),然后将 int32 转换为双精度,然后执行加法操作,这将导致值为 n1 + n2 的双精度。
我还想为类型转换提供支持。
正确执行此操作的最佳方法是什么?有没有办法很好地做到这一点,或者我必须放置十亿个转换函数,如 uint32todouble、int32todouble、int32tolongdouble、int64tolongdouble 等。
谢谢!
编辑:我被要求澄清我的问题,所以我会的。 我同意这与 bison/flex 没有直接关系,但我希望有这方面经验的人给我提示。
假设我用自己的“编程”语言进行了这样的操作(我会说它更像是脚本,但无论如何),即我要解析的那个:
int64 b = 237847823435ll
int64 a = int64(82 + 3746.3746434 * 265.345 + b)
这里,int64() 伪函数是一个类型转换。首先,我们可以看到 82 是一个 int 常量,其次是 3746.3746434 和 265.345,而 b 是一个 int64。所以当我在 A 做手术时,我必须:
- 将82的类型改为double
- 将 b 的类型更改为 double
- 进行计算
- 由于我们有一个 double 并且我们想将其转换为 int64,将 double 转换为 int64,并将结果存储在变量“a”中
如您所见,类型更改相当多……而且我想知道我如何才能以最优雅和尽可能少的工作来完成它们。我说的是内部实现。 例如,我可以写如下内容:
int64_t double_to_int64(double k) {
return (int64_t) k; // make specific double to int64 conversion
}
对于每种类型,我都有特定于每个转换的功能,但是实现它需要相当多的时间,而且它是一种丑陋的做事方式。由于我的解析器/词法分析器中的一些变量和数字标记存储在缓冲区中(出于不同的原因),我真的不知道如何找到一种方法来从一种类型转换为另一种类型而不执行这些功能。更不用说所有无符号/有符号类型,它会使所需函数的数量增加一倍。
谢谢
【问题讨论】:
标签: c casting type-conversion language-design