OCaml中的扫描和负整数文字

Rom*_*ldo 1 ocaml operators literals lexical-analysis

根据OCaml手册,整数文字可以是负数.例如,-321是一个有效的整数文字.

该手册还指出根据最长匹配规则解决词汇歧义:当字符序列可以以几种不同方式分解为两个令牌时,保留的分解是具有最长第一令牌的分解.

因此,表达式8-3应该被分解为两个词法符号8-3导致类型错误,而不是三个词法符号8,-并且3给出二进制操作.但第二种解释是我在顶层评估这个表达式时得到的结果.

我是否遗漏了手册中的内容,或者这个主题是否真的不完整?如果以后,手册可能应该修复.

cam*_*ter 5

在OCaml语法定义的词法分析器级别(lexer.mll)中,定义了不带-前缀的整数文字.例如,

let decimal_literal =
  ['0'-'9'] ['0'-'9' '_']*

let int_literal =
  decimal_literal | hex_literal | oct_literal | bin_literal
Run Code Online (Sandbox Code Playgroud)

的分辨率-标志是在分析器(parser.mly)级别进行.所以这8-3可以解析为(8)-(3)而不是8 (-3).Sole -3在解析器级别也被解析为负整数常量.这就是事情的实施方式.

http://caml.inria.fr/pub/docs/manual-ocaml/expr.html#sec138-解释了前缀的特殊处理.该手册解释了与实现不同的内容,但它说明了惯例.我认为实施起来不需要非常精确.如果您觉得要修复,可以在http://caml.inria.fr/mantis/my_view_page.php创建一张票.

  • 不要打扰创建一个它不会被修复的票.见http://caml.inria.fr/mantis/view.php?id=6015 (2认同)