From bdb5f9ad4bd7d645486f26c70010f873355a7082 Mon Sep 17 00:00:00 2001 From: fef Date: Fri, 29 Jul 2022 05:32:44 +0200 Subject: [PATCH] add dot operator for member access --- src/ast/mod.rs | 10 ++++++++++ src/ast/tree.rs | 2 ++ src/lex/mod.rs | 1 + src/lex/token.rs | 2 ++ 4 files changed, 15 insertions(+) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 85e1558..ffc0b6e 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -570,6 +570,16 @@ impl Parser { index: Box::new(index), }) } + token::Kind::Dot => { + // member access + self.lexer.next(); + let member = self.lexer.expect_kind(token::Kind::Ident)?; + self.parse_primary_expr_rest(tree::Node::BinaryExpr { + op: Operator::Dot, + lhs: Box::new(start), + rhs: Box::new(tree::Node::Ident(member.raw)), + }) + } _ => Ok(start), } } else { diff --git a/src/ast/tree.rs b/src/ast/tree.rs index a6d73e1..d0c9eb5 100644 --- a/src/ast/tree.rs +++ b/src/ast/tree.rs @@ -74,6 +74,7 @@ pub enum Node { #[derive(Debug, PartialEq)] pub enum Operator { + Dot, Eq, EqEq, Bang, @@ -284,6 +285,7 @@ impl Operator { pub fn raw(&self) -> &'static str { match self { + Operator::Dot => ".", Operator::Eq => "=", Operator::EqEq => "==", Operator::BangEq => "!=", diff --git a/src/lex/mod.rs b/src/lex/mod.rs index f4d31cf..9a26453 100644 --- a/src/lex/mod.rs +++ b/src/lex/mod.rs @@ -79,6 +79,7 @@ impl Iterator for Lexer { ']' => self.token_ok(token::Kind::CBracket), '(' => self.token_ok(token::Kind::OParen), ')' => self.token_ok(token::Kind::CParen), + '.' => self.token_ok(token::Kind::Dot), '=' if self.skip_if_match("=") => self.token_ok(token::Kind::EqEq), '=' => self.token_ok(token::Kind::Eq), diff --git a/src/lex/token.rs b/src/lex/token.rs index e6bf454..fbc9672 100644 --- a/src/lex/token.rs +++ b/src/lex/token.rs @@ -33,6 +33,7 @@ pub enum Kind { CParen, Comma, Semi, + Dot, Eq, EqEq, @@ -183,6 +184,7 @@ impl fmt::Display for Kind { Kind::CParen => "cparen", Kind::Comma => "comma", Kind::Semi => "semi", + Kind::Dot => "dot", Kind::Eq => "eq", Kind::EqEq => "eqeq",