[fine] Support assignment to member, loops with iterators

Hmm it's starting to look like something.
This commit is contained in:
John Doty 2024-02-07 01:57:41 -08:00
parent 3415b1a3f6
commit 239e859eaf
7 changed files with 360 additions and 171 deletions

View file

@ -961,7 +961,8 @@ fn infix_power(token: TokenKind) -> Option<(u8, u8)> {
//
// UNARY_POWER goes here.
//
TokenKind::Dot => Some((18, 19)),
TokenKind::LeftParen => Some((18, 19)),
TokenKind::Dot => Some((20, 21)),
_ => None,
}
}
@ -970,11 +971,6 @@ fn expression_with_power(p: &mut CParser, minimum_power: u8) {
let Some(mut expr) = prefix_expression(p) else {
return;
};
while p.at(TokenKind::LeftParen) {
let m = p.start_before(expr);
argument_list(p);
expr = p.end(m, TreeKind::CallExpression);
}
loop {
let token = p.peek();
@ -986,17 +982,23 @@ fn expression_with_power(p: &mut CParser, minimum_power: u8) {
}
expr = match token {
TokenKind::Dot => member_access(p, expr, rp),
TokenKind::Dot => member_access(p, expr),
TokenKind::Is => is_expression(p, expr, rp),
TokenKind::LeftParen => call(p, expr),
_ => binary_expression(p, expr, rp),
};
}
}
fn member_access(p: &mut CParser, left: MarkClosed, right_power: u8) -> MarkClosed {
fn member_access(p: &mut CParser, left: MarkClosed) -> MarkClosed {
let m = p.start_before(left);
p.advance(); // Consume the operator
expression_with_power(p, right_power);
p.expect(
TokenKind::Identifier,
"expected an identifier after a '.' in member access",
);
p.end(m, TreeKind::MemberAccess)
}
@ -1016,6 +1018,12 @@ fn is_expression(p: &mut CParser, left: MarkClosed, right_power: u8) -> MarkClos
p.end(m, TreeKind::IsExpression)
}
fn call(p: &mut CParser, left: MarkClosed) -> MarkClosed {
let m = p.start_before(left);
argument_list(p);
p.end(m, TreeKind::CallExpression)
}
const PATTERN_START: &[TokenKind] = &[TokenKind::Identifier, TokenKind::Underscore];
fn pattern(p: &mut CParser, right_power: u8) {