1
0
Fork 0

Add parsing for blocks

This commit is contained in:
Vili Sinervä 2025-01-31 16:19:28 +02:00
parent b36a4b2bdf
commit 640b4b8b10
No known key found for this signature in database
GPG key ID: DF8FEAF54EFAC996

View file

@ -36,7 +36,7 @@ fn parse_expression<'source>(
&["+", "-"], // 5 &["+", "-"], // 5
&["*", "/", "%"], // 6 &["*", "/", "%"], // 6
&["not", "-"], // 7 &["not", "-"], // 7
// 8 // 8, everything not explicitly listed above goes here
]; ];
match level { match level {
@ -92,7 +92,8 @@ fn parse_term<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression
}, },
TokenType::Punctuation => match token.text { TokenType::Punctuation => match token.text {
"(" => parse_parenthesized(pos, tokens), "(" => parse_parenthesized(pos, tokens),
_ => todo!(), "{" => parse_block(pos, tokens),
_ => unreachable!(),
}, },
_ => panic!("Unexpected {}", token), _ => panic!("Unexpected {}", token),
} }
@ -122,6 +123,27 @@ fn parse_parenthesized<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> E
expression expression
} }
fn parse_block<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> {
consume_string(pos, tokens, "{");
let mut expressions = Vec::new();
loop {
expressions.push(parse_expression(0, pos, tokens));
if peek(pos, tokens).text == "}" {
break;
}
consume_string(pos, tokens, ";");
if peek(pos, tokens).text == "}" {
expressions.push(EmptyLiteral());
break;
}
}
consume_string(pos, tokens, "}");
Block(expressions)
}
fn parse_function<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> { fn parse_function<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> {
let identifier = consume_type(pos, tokens, TokenType::Identifier); let identifier = consume_type(pos, tokens, TokenType::Identifier);
consume_string(pos, tokens, "("); consume_string(pos, tokens, "(");