OCaml中的扫描和负整数文字

时间:2015-04-19 13:11:11

标签: operators ocaml literals lexical-analysis

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

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

因此,表达式8-3应该被分解为导致类型错误的两个词汇符号8-3,而不会分解为三个词法符号8,{ {1}}和-,提供二进制操作。但第二种解释是我在顶层评估这个表达式时得到的结果。

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

1 个答案:

答案 0 :(得分:5)

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

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

let int_literal =
  decimal_literal | hex_literal | oct_literal | bin_literal

-符号的解析在解析器(parser.mly)级别完成。因此8-3可以解析为(8)-(3)而不是8 (-3)。在解析器级别中,唯一的-3被解析为负整数常量。这就是事情的实施方式。

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