bison / flex中的多种数据类型

时间:2013-12-18 23:37:15

标签: c casting type-conversion language-design

我正在编写一个带有多种数据类型的bison / flex解析器,它们都与ANSI C兼容。它不是C语言,但会保留其数据类型。 事情是......我不确定如何正确地做到这一点。

例如,在表达式中,比如'n1'+'n2',如果'n1'是double,'n2'是32位整数,我需要进行类型转换吗?怎么做正确? 即我逻辑上需要评估哪个类型更大(这里是双倍),然后将int32转换为double,然后执行add操作,这将导致值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处进行操作时,我将不得不:

  1. 将82的类型更改为double
  2. 将b的类型更改为double
  3. 进行计算
  4. 由于我们有一个double并且我们想将它转换为int64,将double转换为int64,并将结果存储在变量'a'
  5. 如你所见,它有很多类型的变化......我想知道如何以最优雅和最少的工作方式来做它们。我在谈论内部实施。 我可以写例如:

    int64_t double_to_int64(double k) {
        return (int64_t) k; // make specific double to int64 conversion
    }
    

    对于每种类型,我都有特定于每次转换的功能,但实现它需要花费很多时间,而且它是一种丑陋的做事方式。由于我的解析器/词法分析器中的一些变量和数字标记存储在缓冲区中(出于不同的原因),我实际上并没有看到如何在不执行此类功能的情况下找到从类型转换为另一种类型的方法。更不用说所有未签名/签名的类型,它将使所需函数的数量翻倍。

    由于

1 个答案:

答案 0 :(得分:1)

这与flex或bison无关。这是一个语言设计问题。

  1. 我建议你看一下其他语言的类型推广功能。例如,只要在表达式中使用,C和Java就会将byte,char和short提升为int。这样就可以直接减少很多麻烦。

  2. 这些操作是硬件上的单个指令。您根本不需要编写任何函数;只需生成适当的代码。如果您正在设计解释系统,请相应地设计p代码。