This looks completely trivial, and I am no rookie, but it still surprises me:
$ ocaml
OCaml version 4.14.0
Enter #help;; for help.
# (Ok 5.0) ;;
- : (float, 'a) result = Ok 5.
# (Ok -5.0) ;;
Error: The constructor Ok expects 1 argument(s),
but is applied here to 0 argument(s)
# (Ok (-5.0)) ;;
- : (float, 'a) result = Ok (-5.)
#
Looks like the “-” is parsed as an operator and not as part of the float literal, but doesn’t this violate the “longest first” lexing rule?
–
Ian
The unary operator -
is always tokenized as an unary operator. Thus the flow of tokens emitted by the lexer for
Ok -5.0
is
UIDENT("Ok") MINUS FLOAT(5.0)
The really strange corner case is
let (~-) x = x
let mystery =
let x = 5.0 in
-x + -5.0
(which is due to the fact that the parser recognizes the notion of signed constants)
1 Like
UIDENT("Ok") MINUS FLOAT(5.0)
Right, that is what I suspected.
the parser recognizes the notion of signed constants
The parser, and not the lexer?
–
Ian
I think you meant to use +.
in there, yes?
Oho, this is interesting! So -x
is not represented analogously to -5.0
: the first is the application of the operator “-” (or “-.”) to the expression x
. The second is a signed constant. Interesting. Gotta remember this!
Yes, it is the parser that recognizes that MINUS constant
is a signed constant: ocaml/parser.mly at trunk · ocaml/ocaml · GitHub .
1 Like