【问题标题】:Multiple data types in bison/flexbison/flex 中的多种数据类型
【发布时间】: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 做手术时,我必须:

  1. 将82的类型改为double
  2. 将 b 的类型更改为 double
  3. 进行计算
  4. 由于我们有一个 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


    【解决方案1】:

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

    1. 建议你看看其他语言的类型提升特性。例如,无论何时在表达式中使用,C 和 Java 都会将 byte、char 和 short 提升为 int。所以这立即减少了很多笑声。

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

    【讨论】:

    • 等等。我不是在问如何正常执行此操作。我正在寻求一种快速的方法来做到这一点,在 bison/flex 上下文中。它根本与语言无关,因为我基本上做了编译器通常会做的事情。我的问题还更多地是关于与 int 结合使用的浮动,而不是不同的 int 类型,因为我只需将所有内容存储在 uint64 中,并将 IDIV 用于无符号类型,将 DIV 用于有符号类型。我的问题更多......如何使其快速,而不为每次转换创建一个函数。另外,您所说的p代码是什么意思?你能澄清一下吗?谢谢
    • 第二条评论。我给出的函数...... uint32todouble() 等。这不会在语言内部,那些将是内部函数,旨在在用户进行类型转换的情况下在另一个类型之间转换类型。我确实需要一个函数,例如,可以将任何 int 转换为任何 double,因此我不必每次都检查哪些操作数是哪些类型才能正确转换,并且有 20 个函数可以在类型之间进行特定转换还有一个!
    • 我不知道你在问什么。 “flex”生成词法扫描器,“bison”生成解析器。除了所涉及的关键字之外,它们都与正在扫描和解析的编程语言中的数据类型无关。除非您正在编写源解释器? ...在这种情况下,您所要做的就是编写类型转换,而不是无数函数。你确实需要澄清你在说什么。
    • 我仍然不知道为什么你认为你需要编写像double_to_int64() 这样的函数,而它们所做的只是一个类型转换。只需编写类型转换而不是函数调用,不要编写函数。它在开发时更快,在运行时也更快。
    • 类型转换或编写函数。基本上是一样的。总而言之,我将不得不手动考虑每个类型转换!我正在寻找一种更通用的方法。就像...如果某些我不知道的功能或某些库可以做到这一点。如前所述,我正在寻找一种同质的方式,但我只是不知道它是否存在!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多