我正在编写一个bison/flex解析器,它有多种数据类型,都与ANSI C兼容。它不会是C语言,但会保留其数据类型。问题是…我不知道如何正确地做这件事。
例如,在一个表达式中,比如"n1"+"n2",如果"n1"是双精度的,"n2"是32位整数,我需要进行类型转换,对吗?如何正确操作?即,我在逻辑上需要评估哪种类型更大(这里是double),然后将int32转换为double,然后执行加法运算,这将导致值n1+n2的double。
我还想为类型铸造提供支持。
正确地做这件事的最佳方法是什么?有没有一种方法可以很好地做到这一点,或者我必须放入十亿个转换函数,如uint32todouble、int32tolongdouble、int64tolongdouble等。
谢谢!
编辑:我被要求澄清我的问题,所以我会的。我同意这与野牛/flex没有直接关系,但我希望有经验的人能提醒我。
假设我在自己的"编程"语言中有这样一个操作(我会说它更多的是脚本,但无论如何),即我将解析的操作:
int64 b = 237847823435ll
int64 a = int64(82 + 3746.3746434 * 265.345 + b)
这里,int64()伪函数是一个类型转换。首先,我们可以看到82是一个int常数,后面是37463746434和265.345,b是一个int64。所以当我在A做操作时,我必须:
- 将82的类型更改为double
- 将b的类型更改为double
- 进行计算
- 由于我们有一个double,并且我们希望将其强制转换为int64,因此将double转换为int六十四,并将结果存储在变量"a"中
正如您所看到的,它有很多类型更改。。。例如,我想知道我如何才能以最优雅、尽可能少的工作量完成这些工作。我说的是内部实施。例如,我可以写这样的东西:
int64_t double_to_int64(double k) {
return (int64_t) k; // make specific double to int64 conversion
}
对于每种类型,我都有特定于每种转换的函数,但实现它需要相当长的时间,尽管这是一种糟糕的做法。由于解析器/lexer中的一些变量和数字标记存储在缓冲区中(出于不同的原因),我真的不知道如何在不执行此类函数的情况下找到从一种类型转换为另一种类型的方法。更不用说所有的无符号/有符号类型,它将使所需函数的数量增加一倍。
感谢
这与flex或bison无关。这是一个语言设计问题。
-
我建议你看看其他语言的类型提升功能。例如,无论何时在表达式中使用,C和Java都会将byte、char和short提升为int。因此,这会直接减少很多笑声。
-
这些操作是硬件上的单个指令。您根本不需要编写任何函数;只需生成适当的代码。如果你正在设计一个解释系统,那么就相应地设计p代码。