Parsing Ocaml“;“最长比赛”;规则:“;减;解析为二进制或一元运算符的运算符

Parsing Ocaml“;“最长比赛”;规则:“;减;解析为二进制或一元运算符的运算符,parsing,ocaml,Parsing,Ocaml,我的职能是: let increment n = n+1;; 我对函数的调用: let x = increment -5;; 我得到的错误是: let x = increment -5;; ^^^^^^^^^ Error: This expression has type int -> int but an expression was expected of type int` 为什么函数调用后不执行x=-4 我试着自己找到答案,结果我来到了这里:

我的职能是:

let increment n = n+1;;
我对函数的调用:

let x = increment -5;;
我得到的错误是:

let x = increment -5;;
        ^^^^^^^^^
Error: This expression has type int -> int
       but an expression was expected of type int`
为什么函数调用后不执行
x=-4

我试着自己找到答案,结果我来到了这里:


术语“最长匹配规则”用于歧义部分,我假设对该术语的澄清可以解决我的问题?

问题很简单,
-
在这里被视为二进制运算符
减号
,因此OCaml将其读取为
增量减5
increment
5
是两个操作数),而您需要的是
递增数字(减5)
increment
是一个函数)


只要写
increment(-5)
,工作就完成了。

问题很简单,
-
在这里被认为是二进制运算符
,所以OCaml将其读取为
increment减5
increment
5
是两个操作数),而您需要的是
增加数字(减5)
作为函数的增量)


只需写
增量(-5)
,工作就完成了。

另一个答案中建议使用括号的替代方法是使用
@
应用程序操作符,例如:

let increment n = n + 1
let x = increment @@ -5
简而言之,
f@@x
f x
相同,但
@
运算符的优先级低于算术运算,而函数应用程序的优先级更高。因此,使用应用程序运算符可以省略括号

有时,反向应用程序操作符
|>
可能更惯用;它通常用于通过一个或多个函数应用程序“管道”表达式

例如:

let increment n = n + 1
let x = -5 |> increment
let clamp x low high = x |> min high |> max low

另一个答案中建议使用括号的替代方法是使用
@
应用程序运算符,例如:

let increment n = n + 1
let x = increment @@ -5
简而言之,
f@@x
f x
相同,但
@
运算符的优先级低于算术运算,而函数应用程序的优先级更高。因此,使用应用程序运算符可以省略括号

有时,反向应用程序操作符
|>
可能更惯用;它通常用于通过一个或多个函数应用程序“管道”表达式

例如:

let increment n = n + 1
let x = -5 |> increment
let clamp x low high = x |> min high |> max low

或者对INTS使用
~-5
一元否定运算符,但为什么它在这里被视为二进制运算符,而不是标记
-5
的一部分?根据OP中链接的词法规则,我看不出为什么
-
应该在这里被视为它自己的标记。@Lhooq数字的词法规则包括一个可选的前导“-”。因此,
-5
应作为单个整数标记进行词法分析,而
-5
应作为两个标记进行词法分析。但这显然不是实际情况,因此,除非你能指出我在链接页面上遗漏了什么,否则在我看来,页面上的规则并不准确(或者编译器没有正确地实现它们,这取决于您的观点)。@Lhooq正如sepp2k所提到的,它非常清楚地表明
-5
本身就是一个有效的整数文字标记。lexer认为不是这样()可能有很好的理由只考虑正数作为一个标记,但是真正的问题是手册和实现之间的差异。对,你不能说出事物是如何从词法规则中辨认出来的。但是你可以知道它们是如何被词汇化的。你说“它不是一个标记,而是两个”。,但如何从手册中证明这一点呢?手册说整数标记可以以“-”开头,因此,如果这是真的,
-1
显然是一个标记。一旦我们确定
-1
是两个标记,其余的从解析器中可以明显看出,但是
-1
是一个还是两个标记的决定是由词法分析器做出的。手册中对词法规则的描述给出了与工具不同的答案或使用INTS的一元否定运算符
~-5
,但为什么它在这里被视为二进制运算符而不是标记
-5
?根据OP中链接的词法规则,我看不出有任何理由将
-
视为它自己的标记。@Lhooq数字的词法规则包括一个可选的前导“-”。因此,
-5
应作为单个整数标记进行词法分析,而
-5
应作为两个标记进行词法分析。但这显然不是实际情况,因此,除非你能指出我在链接页面上遗漏了什么,否则在我看来,页面上的规则并不准确(或者编译器没有正确地实现它们,这取决于您的观点)。@Lhooq正如sepp2k所提到的,它非常清楚地表明
-5
本身就是一个有效的整数文字标记。lexer认为不是这样()可能有很好的理由只考虑正数作为一个标记,但是真正的问题是手册和实现之间的差异。对,你不能说出事物是如何从词法规则中辨认出来的。但是你可以知道它们是如何被词汇化的。你说“它不是一个标记,而是两个”。,但如何从手册中证明这一点呢?手册说整数标记可以以“-”开头,因此,如果这是真的,
-1
显然是一个标记。一旦我们确定
-1
是两个标记,其余的从解析器中可以明显看出,但是
-1
是一个还是两个标记的决定是由词法分析器做出的。手册中对词法规则的描述给出了与工具不同的答案反倾销。