153 Commits

Author SHA1 Message Date
René Kijewski
d4fbad1db2 Optimize parsing boolean literals, too 2023-08-03 00:02:04 +02:00
René Kijewski
95ff27c087 Parse paths and identifiers only once
In the old implementation each variable in an expression would be parsed
up to three times:

* Try to parse a path because it contains a leading double colon, or
  infix double colons.
* Try to parse it as path again by scanning for an identifier that
  contains an upper case character.
* Fall back to scanning for any identifier.

This PR turns all three steps into one, without the need for
backtracking.
2023-08-03 00:02:04 +02:00
René Kijewski
d38e2b4e26 parser: fix white space issues in macro parsing 2023-08-02 11:09:05 +02:00
René Kijewski
06ad86b1e1 parser: allow negative numbers in patterns 2023-08-02 11:09:05 +02:00
René Kijewski
50745e41c2 parser: don't truncates whitespaces after arrays 2023-08-02 11:09:05 +02:00
René Kijewski
d09041bd0a parser: better error message for unknown nodes 2023-08-02 11:09:05 +02:00
René Kijewski
04e585b9d2 parser: import parser::{Expr, Node} 2023-08-01 13:04:41 +02:00
René Kijewski
c8399c75ed parser: node::Loop is much bigger than the other variants 2023-08-01 13:04:41 +02:00
René Kijewski
11f3d0714c parser: move test for completeness 2023-08-01 13:04:41 +02:00
René Kijewski
4315773676 parser: add type for Node::Comment 2023-08-01 13:04:41 +02:00
René Kijewski
32cd2825c4 parser: add expr::Loop::parse() 2023-08-01 13:04:41 +02:00
René Kijewski
cdfe287b73 parser: remove re-exports parser::{node,expr}::* 2023-08-01 13:04:41 +02:00
René Kijewski
1521a08a20 parser: add type for Node::Extends 2023-08-01 13:04:41 +02:00
René Kijewski
14df8e16c1 parser: add type for Node::Include 2023-08-01 13:04:41 +02:00
René Kijewski
c5c46ada40 parser: rename Node::Cond into If and add type 2023-08-01 13:04:41 +02:00
René Kijewski
fa3a3271ee parser: add type for Node::Let 2023-08-01 13:04:41 +02:00
René Kijewski
6323b5e171 parser: add type for Node::Raw 2023-08-01 13:04:41 +02:00
René Kijewski
7b7c38b377 parser: add type for Node::Lit 2023-08-01 13:04:41 +02:00
René Kijewski
26f598c0d1 parser: add type for Node::BlockDef 2023-08-01 13:04:41 +02:00
René Kijewski
108c4a6a33 parser: add type for Node::Match 2023-08-01 13:04:41 +02:00
René Kijewski
4f52dbe8be parser: add type for Node::Call 2023-08-01 13:04:41 +02:00
René Kijewski
cd075630ea parser: add type for Node::Import 2023-08-01 13:04:41 +02:00
René Kijewski
222c42917a parser: let Macro know its name 2023-08-01 13:04:41 +02:00
René Kijewski
ffe267be7a parser: add Ast::nodes() method 2023-08-01 10:51:57 +02:00
René Kijewski
cbf766fa1f parser: impement PartialEq for Ast 2023-08-01 10:51:57 +02:00
René Kijewski
cfed9274e2 parser: implement Debug for Parsed 2023-08-01 10:51:57 +02:00
René Kijewski
382c3239f2 parser: use ? 2023-08-01 10:51:57 +02:00
René Kijewski
b3843d90a8 parser: ensure correct drop order for Parsed
According to [RFC 1857] the fields of a struct are dropped in the same
order as they are declared. For `struct S { a: A, b: B }` field `a` is
dropped before field `b`.

Our struct `Parsed` is self referencial. Its field `ast` depends on
`source`, so `source` must outlife `ast`. This PR changes the order of
the fields to reflect this requirement. In practice it should not
matter, because we know that the variant of `Node` won't access the
string data during their `Drop`, but better safe than sorry - maybe
`Node` changes in the future.

[RFC 1857]: https://rust-lang.github.io/rfcs/1857-stabilize-drop-order.html
2023-08-01 10:51:57 +02:00
René Kijewski
7c3a85de4f parser: remove panicking From<&str> for Whitespace 2023-08-01 07:06:30 +02:00
René Kijewski
985eb8955f Fix parsing arrays
This change

* allows using empty arrays `[]` in expessions,
* adds a cut when the leading `[` was encountered, and
* fixes the interaction between arrays and boolean OR.

IMO the restriction that you couldn't use empty arrays is not needed.
The missing cut made error messages slictly worse if you forget to add
the closing `]`.

Filter expressions must not have white spaces before the pipe `|`. The
white space is used to tell a filter expressions, and `std::ops::Or`
apart.
2023-07-31 21:29:35 +02:00
René Kijewski
107bdfdd76 Fix parsing calls
This change:

* adds a cut when the leading `(` was encountered, and
* fixed the interaction between call expressions and boolean OR.
2023-07-31 21:29:35 +02:00
Dirkjan Ochtman
266cefc321 parser: rename block to nodes 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
f9b2259cb7 parser: reorder items in node module 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
447aab0f10 parser: move Expr parser helpers into callers 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
40239f0f20 parser: move single expr parsers into Expr impl 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
ea1b4f9c41 parser: move binary operator parsers into Expr impl 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
8d8391543c parser: flatten top-level Expr interface 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
c5174eb829 parser: move suffix parsers into impl block 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
f4aa2e149c parser: move cond parsers into type impls 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
09865151e4 parser: move parser helpers into callers 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
997c5e1930 parser: move when parsers into impl block 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
65fb563082 parser: define a struct for Match 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
f16ddb14f0 parser: define a struct for Cond 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
cdbe8ef39f parser: move node parsers into impl block 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
aa22236a60 parser: move Whitespace parser into method 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
a50212a097 parser: move impl blocks closer to type definitions 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
dcfa5e1c69 parser: simplify top-level parser match 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
faf2e34cbf parser: add top-level Ast type 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
2376cc6815 parser: move nested_parenthesis() helper into node module 2023-07-31 10:27:15 +02:00
Dirkjan Ochtman
1677fd6f57 parser: move helper functions into State impl 2023-07-31 10:27:15 +02:00