diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-01-28 20:02:42 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-01-28 20:02:42 +0100 |
| commit | 76b1d4a93f6d045901f17db46d82a97c9f407703 (patch) | |
| tree | f851460a038a4c543e3900352ec1a2903b6c9849 /src/parse/mod.rs | |
| parent | 2d97d406aced1f1ab7d3bc459e31bb0eff92b892 (diff) | |
Parse `show` and `wrap` expressions
Diffstat (limited to 'src/parse/mod.rs')
| -rw-r--r-- | src/parse/mod.rs | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs index a9752645..72d38b46 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -208,6 +208,8 @@ fn markup_node(p: &mut Parser, at_start: &mut bool) { NodeKind::Ident(_) | NodeKind::Let | NodeKind::Set + | NodeKind::Show + | NodeKind::Wrap | NodeKind::If | NodeKind::While | NodeKind::For @@ -275,7 +277,14 @@ fn enum_node(p: &mut Parser, at_start: bool) { /// 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 stmt = matches!( + token, + NodeKind::Let + | NodeKind::Set + | NodeKind::Show + | NodeKind::Wrap + | NodeKind::Import + ); let group = if stmt { Group::Stmt } else { Group::Expr }; p.start_group(group); @@ -388,6 +397,8 @@ fn primary(p: &mut Parser, atomic: bool) -> ParseResult { // Keywords. Some(NodeKind::Let) => let_expr(p), Some(NodeKind::Set) => set_expr(p), + Some(NodeKind::Show) => show_expr(p), + Some(NodeKind::Wrap) => wrap_expr(p), Some(NodeKind::If) => if_expr(p), Some(NodeKind::While) => while_expr(p), Some(NodeKind::For) => for_expr(p), @@ -714,6 +725,26 @@ fn set_expr(p: &mut Parser) -> ParseResult { }) } +/// Parse a show expression. +fn show_expr(p: &mut Parser) -> ParseResult { + p.perform(NodeKind::ShowExpr, |p| { + p.eat_assert(&NodeKind::Show); + expr(p)?; + p.eat_expect(&NodeKind::As)?; + expr(p) + }) +} + +/// Parse a wrap expression. +fn wrap_expr(p: &mut Parser) -> ParseResult { + p.perform(NodeKind::WrapExpr, |p| { + p.eat_assert(&NodeKind::Wrap); + ident(p)?; + p.eat_expect(&NodeKind::In)?; + expr(p) + }) +} + /// Parse an if expresion. fn if_expr(p: &mut Parser) -> ParseResult { p.perform(NodeKind::IfExpr, |p| { |
