99519c62

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

Add end-of-line comments and comments within declarations

A comment used to be a declaration of its own, so a comment written at the
end of a line, or between the lines of a transaction, was either a parse
error or was moved onto its own line by the formatter.

Every line can now carry a comment at the end of it, and comments on
indented lines of their own.  A comment on a line of its own belongs to the
line below it, so a comment cannot be the last line of a declaration: it
would belong to no line at all, which is an error that points at the
comment.

A comment on a line of its own has to be indented to belong to the
declaration it is in: a "--" at the first column starts a new declaration.
Comments above a declaration are already declarations of their own, so the
lines that a declaration cannot contain, an import, a currency, a tag, a
price, an account line and a timestamp line, hold only an end-of-line
comment.

The one line that cannot carry a comment at the end of it is a description,
because a description is the whole rest of its line.

Note that the lines of a transaction are one chain of productions rather
than three lists.  The comments above a line have to be read before it is
known which kind of line follows them, so a list per kind of line makes the
description/posting and posting/extra boundaries reduce/reduce conflicts.

Fix two bugs in the process, both of which the extra comment positions would
otherwise have made much easier to hit:

  * A comment whose text was only whitespace swallowed the declaration below
    it.  Nothing could match the rest of the line, so '$white+' matched the
    newline instead and left the lexer in the comment start code, reading the
    next declaration as comment text.  A comment is now a single token, so
    there is no start code left to be stranded in.

  * A file path was lexed with a character set containing an unescaped '.',
    which means "any character but a newline", so a path ran to the end of
    the line.  A trailing comment ended up inside the path.  A path may now
    contain spaces but not the "-- " that starts a comment.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 0s 1s 1s 1s 0s
Eval 1s 14s 14s 16s 0s
Build 14s 4m08s 2m11s 2m25s 0s
Suite 0s 4m25s 2m25s 2m25s 0s

Timeline

0s10s20s30s40s50s1m1m10s1m20s1m30s1m40s1m50s2m2m10s2m20s