diff options
| author | Martin Haug <mhaug@live.de> | 2021-11-18 16:21:45 +0100 |
|---|---|---|
| committer | Martin Haug <mhaug@live.de> | 2021-11-18 16:21:45 +0100 |
| commit | fdb9d0743d73c278136b9254286fdc4be71c42a5 (patch) | |
| tree | 1ae3c19d13b7cd93477aac908e1561400dcf9092 /src/parse | |
| parent | 3162c6a83a910f34d6ed7e966c11b7e7b5bd4088 (diff) | |
Refactoring and bugfixes
Diffstat (limited to 'src/parse')
| -rw-r--r-- | src/parse/mod.rs | 34 | ||||
| -rw-r--r-- | src/parse/parser.rs | 2 |
2 files changed, 24 insertions, 12 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs index f2fae5f2..f1f1e8b6 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -32,6 +32,13 @@ pub fn parse_atomic(src: &str, _: bool) -> Option<(Vec<Green>, bool)> { p.eject_partial() } +/// Parse an atomic primary. Returns `Some` if all of the input was consumed. +pub fn parse_atomic_markup(src: &str, _: bool) -> Option<(Vec<Green>, bool)> { + let mut p = Parser::new(src, TokenMode::Markup); + markup_expr(&mut p); + p.eject_partial() +} + /// Parse some markup. Returns `Some` if all of the input was consumed. pub fn parse_markup(src: &str, _: bool) -> Option<(Vec<Green>, bool)> { let mut p = Parser::new(src, TokenMode::Markup); @@ -171,17 +178,7 @@ fn markup_node(p: &mut Parser, at_start: &mut bool) { | NodeKind::While | NodeKind::For | NodeKind::Import - | NodeKind::Include => { - let stmt = matches!(token, NodeKind::Let | NodeKind::Set | NodeKind::Import); - let group = if stmt { Group::Stmt } else { Group::Expr }; - - p.start_group(group); - let res = expr_prec(p, true, 0); - if stmt && res.is_ok() && !p.eof() { - p.expected_at("semicolon or line break"); - } - p.end_group(); - } + | NodeKind::Include => markup_expr(p), // Block and template. NodeKind::LeftBrace => block(p), @@ -222,6 +219,21 @@ fn enum_node(p: &mut Parser) { }); } +/// Parse an expression within markup mode. +fn markup_expr(p: &mut Parser) { + if let Some(token) = p.peek() { + let stmt = matches!(token, NodeKind::Let | NodeKind::Set | NodeKind::Import); + let group = if stmt { Group::Stmt } else { Group::Expr }; + + p.start_group(group); + let res = expr_prec(p, true, 0); + if stmt && res.is_ok() && !p.eof() { + p.expected_at("semicolon or line break"); + } + p.end_group(); + } +} + /// Parse an expression. fn expr(p: &mut Parser) -> ParseResult { expr_prec(p, false, 0) diff --git a/src/parse/parser.rs b/src/parse/parser.rs index a37cb9c6..06cb1578 100644 --- a/src/parse/parser.rs +++ b/src/parse/parser.rs @@ -48,7 +48,7 @@ impl<'s> Parser<'s> { } /// End the parsing process and return multiple children. - pub fn eject(self) -> Option<(Vec<Green>, bool)>{ + pub fn eject(self) -> Option<(Vec<Green>, bool)> { if self.eof() && self.group_success() { Some((self.children, self.tokens.was_unterminated())) } else { |
