aboutsummaryrefslogtreecommitdiffstats
path: root/src/parse/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/mod.rs')
-rw-r--r--src/parse/mod.rs37
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>;