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
是一个还是两个标记的决定是由词法分析器做出的。手册中对词法规则的描述给出了与工具不同的答案反倾销。