diff options
| author | Thomas Voss <mail@thomasvoss.com> | 2026-03-04 11:30:26 +0100 |
|---|---|---|
| committer | Thomas Voss <mail@thomasvoss.com> | 2026-03-04 11:34:03 +0100 |
| commit | 44c1c6455e3b0baedac80019652d5d4d9c08a430 (patch) | |
| tree | bde4940dd3a79b56cda022c6001f6947001bcc36 /oryxc/src | |
| parent | 21478939ed1d3d2862e7eb5f39107615a52cf29a (diff) | |
Create the root node
Diffstat (limited to 'oryxc/src')
| -rw-r--r-- | oryxc/src/parser.rs | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/oryxc/src/parser.rs b/oryxc/src/parser.rs index 66562fc..dc3e865 100644 --- a/oryxc/src/parser.rs +++ b/oryxc/src/parser.rs @@ -38,10 +38,9 @@ pub enum AstType { Number, /* (_, _) */ Pointer, /* (rhs, _) */ Return, /* (extra-data, extra-data-len) */ - /* TODO: Construct this thing */ - Root, /* (extra-data, extra-data-len) */ - String, /* (_, _) */ - UnaryOperator, /* (rhs, _) */ + Root, /* (extra-data, extra-data-len) */ + String, /* (_, _) */ + UnaryOperator, /* (rhs, _) */ } #[derive(Clone, Copy)] @@ -218,12 +217,13 @@ impl<'a> Parser<'a> { fn parse_toplevel(&mut self) { let mut syncp = false; - match self.get() { + let k = match self.get() { TokenType::KeywordDef => match self.parse_def() { - Ok(_) => {}, + Ok(e) => e, Err(e) => { self.new_error(e); syncp = true; + u32::MAX }, }, TokenType::Eof => return, @@ -231,16 +231,19 @@ impl<'a> Parser<'a> { self.new_error(OryxError::new( self.get_view(), format!( - "expected top-level statement but got {:?}", + "expected top-level statement but got {:?}", /* TODO: Impl Display for TokenType */ self.get(), ), )); syncp = true; + u32::MAX }, }; if syncp { self.sync(&[TokenType::Eof, TokenType::KeywordDef]); + } else { + self.scratch.push(k); } } @@ -844,9 +847,17 @@ pub fn parse( while p.get() != TokenType::Eof { p.parse_toplevel(); } - return if p.errors.len() != 0 { - Err(p.errors) - } else { - Ok((p.ast, p.extra_data)) - }; + if p.errors.len() != 0 { + return Err(p.errors); + } + + let stmtsbeg = p.extra_data.len(); + let nstmts = p.scratch.len(); + p.extra_data.append(&mut p.scratch); + p.new_node(AstNode { + kind: AstType::Root, + tok: 0, + sub: SubNodes(stmtsbeg as u32, nstmts as u32), + }); + return Ok((p.ast, p.extra_data)); } |