diff options
| author | Jonas Maier <jonas@x77.dev> | 2026-03-14 22:12:42 +0100 |
|---|---|---|
| committer | Jonas Maier <jonas@x77.dev> | 2026-03-14 22:12:42 +0100 |
| commit | 3f7d80b746df37ffcb76076d84c15b7027042a89 (patch) | |
| tree | b0f5cc10b937c8f06a9e65458e01fd05e7d18878 /src/parse | |
| parent | ad9572cc6e89634a4d029cc8d311bb51626c17c3 (diff) | |
| download | pish-3f7d80b746df37ffcb76076d84c15b7027042a89.tar.gz | |
proper blocks
Diffstat (limited to 'src/parse')
| -rw-r--r-- | src/parse/mod.rs | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 93d2de8..eda89f1 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -282,7 +282,40 @@ pub struct FunDecl<S: Stage> { impl Parse for Block { fn parse(b: &mut Cursor<'_>) -> Result<Self> { - todo!() + let mut commands = Vec::new(); + b.spaces(); + + if b.has() && b.peek() == b'{' { + b.adv(); + } else { + return Err(ParseError::NotABlock); + } + + loop { + while { + b.spaces(); + b.has() && b.peek() == b';' + } { + b.adv(); + } + + if b.has() && b"})".contains(&b.peek()) { + break; + } + + let cmd = Ast::parse(b)?; + commands.push(cmd); + } + + if b.has() { + if b.peek() != b'}' { + return Err(ParseError::Expected('}')); + } + } else if !b.is_completion() { + return Err(ParseError::Expected('}')); + } + + Ok(Self { commands }) } } @@ -750,6 +783,8 @@ pub enum ParseError { NotAVarAssign, NotHexDigit, + + NotABlock, } type Result<T> = std::result::Result<T, ParseError>; |
