根据OCaml manual ,整数文字可以是负数。例如,-321
是一个有效的整数文字。
手册还指出,词汇歧义是根据最长匹配规则解决的:当一个字符序列可以通过几种不同的方式分解为两个标记时,保留的分解是最长的分解第一个 token 。
因此表达式 8-3
应分解为两个词法符号 8
和 -3
导致类型错误,而不是分解为三个词法符号 8
、-
和 3
,给出二进制运算。但第二种解释是我在顶层评估此表达式时得到的结果。
我是否从手册中遗漏了某些内容,或者关于该主题的内容确实不完整?如果是后者,手册可能应该修复。
最佳答案
在 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 创建票证如果您觉得它已修复。
关于operators - OCaml 中的扫描和负整数文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29730302/