operators - OCaml 中的扫描和负整数文字

标签 operators ocaml literals lexical-analysis

根据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/

相关文章:

c++ - 运算符 == 错误

C++ 运算符 < 重载

python - 为什么 [] 比 list() 快?

oop - OCaml 中对象内的对象

mysql - 如何将文字列表添加到 SQL 结果

floating-point - 哪些编程语言具有任意精度的浮点文字?

c - c语言中的 "pointer to a pointer"是什么?

javascript - javascript中的逻辑运算符&&和两个字符串

从 C 检查 OCaml 类型签名

ocaml - 如何让 OCaml 顶层使用电池?