diff options
Diffstat (limited to 'src/parse/mod.rs')
| -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>; |
