# welly-parser An artisanal parser for the Welly programming language. It's a recursive descent parser, hand-written (i.e. not using a parser library). It should be fast by design, but I haven't put any effort into optimising it. ## Status The API is incomplete and in flux. The syntax is in less flux, but could still change in the details. Missing features that I do plan to include in the first release include some type literals. Missing features that I don't plan for the first release include floating point literals. These will be added later. ## Syntax choices It is a two-pass parser: - The first pass accepts a significant superset of Welly syntax, while getting the correct structure for syntactically correct programs. Some trivial things are not fully disambiguated; for example numbers and identifiers both parse as type `word::AlphaNumeric`. - The second pass rejects many incorrect programs, generating helpful errors, and fully disambiguates everything. It still accepts a superset of Welly syntax. For example, it will accept `fn(4+5) {}` and `4+5 = foo;` which are not legal in Welly. It also accepts some extra syntax that I plan to use in experimental versions of Welly, e.g. `$x`, `&x` and `x?`. Whitespace and comments are removed. Comments in "doc string positions" will probably be preserved in a future version. If a parse error occurs, the parser does not make a parse tree. Because of these losses, this parser *is not* suitable for use in a code reformatter. This parser *is* suitable for use in a REPL (Read-Eval-Print Loop). Specifically, if you type in half a source file and press "Enter", the parser will not return an incorrect parse tree by mistake, but will instead wait for more input. An example REPL is provided (use `cargo run`).