[MLton] confusing error message from MLton
Stephen Weeks
MLton@mlton.org
Mon, 21 Jun 2004 12:18:44 -0700
> But, I don't know why the grammer isn't parsing the code with = as an
> infix. It seems like the following would be a valid parse:
...
> That is, parse the equals as infix, applied to fiba applied to 4 arguments
> and to the case expression.
Yes, your example is valid. It fails without the parens because case
expressions need to be parenthesized in an infix expression. Have a
look at the grammar on page 63 of the Definition.
> Presumably, the attempt to insert a VAL arises from the use of =.
Yeah, if you replace the "=" by "foo", then the parser quite
reasonably inserts a left paren just before the case expression. I
don't understand why "=" is treated differently, since it is a valid
longid in an infix expression. I don't have a good understanding of
how the error correction works in ML-Yacc works though.
Henry, if you want to take a closer look, in the ML-Yacc User's
Manual, section 1.3 talks about error recovery, and there is also a
reference to a TOPLAS paper on error recovery at the end of the
manual. In ml.grm, the error recovery is specified by the %change
directive, which says:
%change -> VAL | -> THEN | -> ELSE | -> LPAREN | -> SEMICOLON |
DARROW -> EQUALOP | EQUALOP -> DARROW | AND -> ANDALSO | COLON -> OF |
SEMICOLON -> COMMA | COMMA -> SEMICOLON |
-> IN LONGID END | -> ELSE LONGID
I guess that the first entry, "-> VAL" is responsible for the message.
I suspect that this entire directive is copied unchanged from SML/NJ's
parser. I've never had enough trouble fixing parse errors to make it
worth investigating further.