Skip to content

Commit

Permalink
add parsing for member access expression
Browse files Browse the repository at this point in the history
  • Loading branch information
thi8v committed Feb 27, 2024
1 parent bc3bec3 commit c0cdefa
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
2 changes: 1 addition & 1 deletion example/test.zom
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import std.fmt.println // <- NEW better import item! ;)
import std.fmt as f

fn add(a: u32,b: u32) u32 {
println("Hello world!")
f.println("Hello world!")
return a + b
}

Expand Down
30 changes: 30 additions & 0 deletions stage1/zom_parser/src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ impl Parse for Expression {
parse_try!(fn; parser => parse_binary_expr, parsed_tokens, 0, &lhs)
}
T::OpenParen => parse_try!(fn; parser => parse_call_expr, parsed_tokens, &lhs),
T::Oper(Operator::Dot) => {
parse_try!(fn; parser => parse_member_access_expr, parsed_tokens, &lhs)
}
_ => lhs,
};

Expand All @@ -38,6 +41,10 @@ pub enum Expr {
fn_op: Box<Expression>,
args: Vec<Expression>,
},
MemberAccess {
expr: Box<Expression>,
member_name: String,
},

// Primary Expression
IntLitExpr(u64),
Expand Down Expand Up @@ -312,3 +319,26 @@ pub fn parse_parenthesized_expr(parser: &mut Parser) -> ParsingResult<Expression
parsed_tokens,
)
}

pub fn parse_member_access_expr(
parser: &mut Parser,
lhs: &Expression,
) -> ParsingResult<Expression> {
let mut parsed_tokens = Vec::new();

let expr = Box::new(lhs.clone());
let start = expr.span.start;

expect_token!(parser => [T::Oper(Operator::Dot), ()], Dot, parsed_tokens);

let member_name = expect_token!(parser => [T::Ident(name), name.clone()], Ident, parsed_tokens);
let end = span_toks!(end parsed_tokens);

Good(
Expression {
expr: Expr::MemberAccess { expr, member_name },
span: start..end,
},
parsed_tokens,
)
}

0 comments on commit c0cdefa

Please sign in to comment.