根据OCaml manual,整数文字可以是负数。例如,-321
是一个有效的整数文字。
本手册还指出,根据最长匹配规则解决词汇歧义:当一个字符序列可以用几种不同的方式分解成两个令牌时,保留的分解是最长的一个。第一个令牌。
因此,表达式8-3
应该被分解为导致类型错误的两个词汇符号8
和-3
,而不会分解为三个词法符号8
,{ {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创建一张票。