[fine] Support assignment to member, loops with iterators
Hmm it's starting to look like something.
This commit is contained in:
parent
3415b1a3f6
commit
239e859eaf
7 changed files with 360 additions and 171 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue