diff --git a/furc/include/furc/front/ast.hpp b/furc/include/furc/front/ast.hpp index 8344b7e..3035d99 100644 --- a/furc/include/furc/front/ast.hpp +++ b/furc/include/furc/front/ast.hpp @@ -79,8 +79,6 @@ public: virtual decl_type_e decl_type() const = 0; }; -class expr_node; - struct var_decl_node final : public decl_node { decl_type_e decl_type() const override { return Variable; } @@ -103,6 +101,8 @@ public: enum expr_type_e { Literal, + VarRead, + Group, BinaryOp, UnaryOp, }; @@ -114,6 +114,21 @@ public: virtual expr_type_e expr_type() const = 0; }; +struct var_read_expr_node final : public expr_node { + expr_type_e expr_type() const override { return VarRead; } + + std::string name; + + var_read_expr_node(std::string&& name) + : name(std::move(name)) {} +}; + +struct group_expr_node final : public expr_node { + expr_type_e expr_type() const override { return Group; } + + expr_node* inner = nullptr; +}; + struct binary_op_expr_node final : public expr_node { enum binary_op_type { Add = 0, diff --git a/furc/include/furc/front/parser.hpp b/furc/include/furc/front/parser.hpp index ff5930b..b3e17ee 100644 --- a/furc/include/furc/front/parser.hpp +++ b/furc/include/furc/front/parser.hpp @@ -27,7 +27,6 @@ private: stmt_node* parse_stmt(); decl_node* parse_decl(); expr_node* parse_expr(); - lit_node* parse_lit(); ast_type parse_type(); comp_stmt_node parse_comp(); diff --git a/furc/src/front/parser.cpp b/furc/src/front/parser.cpp index c555974..db2badc 100644 --- a/furc/src/front/parser.cpp +++ b/furc/src/front/parser.cpp @@ -89,19 +89,6 @@ expr_node* parser::parse_expr() { return parse_expr_right(parse_expr_unary()); } -lit_node* parser::parse_lit() { - auto token = eat_token(token::Integer, token::Char); - switch (token.type) { - case token::Integer: { - return m_arena->allocate(int_lit_node(token.value.integer)); - } - case token::Char: { - return m_arena->allocate(char_lit_node(token.value.character)); - } - default: throw std::runtime_error("unreachable"); - } -} - ast_type parser::parse_type() { auto token = eat_token(token::S8, token::U8, token::S16, token::U16, token::S32, token::U32, token::S64, token::U64); @@ -131,7 +118,25 @@ comp_stmt_node parser::parse_comp() { } expr_node* parser::parse_expr_primary() { - return parse_lit(); + auto token = eat_token(token::Identifier, token::LParen, token::Integer, token::Char); + switch (token.type) { + case token::Identifier: { + return m_arena->allocate(std::string(token.value.string)); + } + case token::LParen: { + group_expr_node group; + group.inner = parse_expr(); + eat_token(token::RParen); + return m_arena->allocate(std::move(group)); + } + case token::Integer: { + return m_arena->allocate(int_lit_node(token.value.integer)); + } + case token::Char: { + return m_arena->allocate(char_lit_node(token.value.character)); + } + default: throw std::runtime_error("unreachable"); + } } expr_node* parser::parse_expr_unary() {