【问题标题】:How does the ECMA Script 5 spec allow successful parses for hex ints greater than 0xFF?ECMA Script 5 规范如何允许成功解析大于 0xFF 的十六进制整数?
【发布时间】:2013-04-28 15:58:22
【问题描述】:

EMCA262 version 5.1 中,十六进制整数文字的定义是:(文档第 20 页,PDF 第 32 页)

HexIntegerLiteral ::
0xHexDigit
0XHexDigit
HexIntegerLiteral HexDigit

HexDigit :: 其中之一
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

我对 HIL 的理解是这样的:

(HIL(HIL(HIL(HIL(HIL(HIL HD))))))

HIL 可以看起来像 0x0(即 0x 和一个十六进制数字),HD 可以是 0,因此 HIL 可以是 0x00x00x00x00x00

显然没有这样的实现,所以我显然误解了一些东西。我应该如何解释(在我看来)这个递归定义?

【问题讨论】:

  • 一般你都知道一定要写成0x0000?
  • 是的,我知道十六进制应该是什么样子 n_n;
  • 好吧,我不确定 ;-) 所以我不确定你的问题是什么...定义是 HexIntegerLiteral 0x HexDigitHexIntegerLiteral HexDigit。所以我在那个定义中没有看到任何暗示。
  • 是的,在我问之前我接受了我的解释是错误的。我只是不明白为什么会出错。

标签: javascript parsing ecmascript-5 hex ecma262


【解决方案1】:

定义可能是递归的,但它不是那样工作的。基本上,它说 HexIntegerLiteral 是以下之一:

  • 不区分大小写的前缀0x 后跟一个十六进制数字,或
  • 一个 HexIntegerLiteral 后跟 一个十六进制数字

0x00x00 不遵循此定义。原因如下:

0x0

这显然是第一个产品的 HIL。

0x00

这也是第二个产生式的 HIL:HIL 0x0(如上所述)后跟十六进制数字 0

0x00x

这不是 HIL,因为:

  1. 显然不是第一次生产的结果
  2. 这也不是第二个产生的结果:从上面建立的 HIL 0x00 后面跟着一个不是十六进制数字的东西。

换句话说,上面的语法不允许这样:

(HIL (HIL (HIL (HIL (HIL (HIL HD))))))

它允许这样做:

(HIL (HD (HD (HD (HD (HD))))))

【讨论】:

    【解决方案2】:

    HexIntegerLiteral 定义为0X0X 后跟0-F 之一,如...

    //  vv----`0x`
        0x5
    //    ^---Hex Digit
    

    ...或HexIntegerLiteral 后跟0-F 之一,如...

    //  vvv----HexIntegerLiteral
        0x54
    //     ^---Hex Digit
    

    ...或...

    //  vvvv----HexIntegerLiteral
        0x546
    //      ^---Hex Digit
    

    如果你向后工作,它可能看起来更清楚。

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 2010-10-10
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多