summaryrefslogtreecommitdiff
path: root/oryxc/src
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2026-03-04 11:30:26 +0100
committerThomas Voss <mail@thomasvoss.com> 2026-03-04 11:34:03 +0100
commit44c1c6455e3b0baedac80019652d5d4d9c08a430 (patch)
treebde4940dd3a79b56cda022c6001f6947001bcc36 /oryxc/src
parent21478939ed1d3d2862e7eb5f39107615a52cf29a (diff)
Create the root node
Diffstat (limited to 'oryxc/src')
-rw-r--r--oryxc/src/parser.rs35
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));
}