Add parsing for blocks
This commit is contained in:
parent
b36a4b2bdf
commit
640b4b8b10
1 changed files with 24 additions and 2 deletions
|
@ -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, "(");
|
||||||
|
|
Reference in a new issue