aboutsummaryrefslogtreecommitdiffstats
path: root/src/parse
diff options
context:
space:
mode:
authorJonas Maier <jonas@x77.dev>2026-03-14 22:12:42 +0100
committerJonas Maier <jonas@x77.dev>2026-03-14 22:12:42 +0100
commit3f7d80b746df37ffcb76076d84c15b7027042a89 (patch)
treeb0f5cc10b937c8f06a9e65458e01fd05e7d18878 /src/parse
parentad9572cc6e89634a4d029cc8d311bb51626c17c3 (diff)
downloadpish-3f7d80b746df37ffcb76076d84c15b7027042a89.tar.gz
proper blocks
Diffstat (limited to 'src/parse')
-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>;