From 8e853aaaf26104ec616bb8e088d92ad48f93b43a Mon Sep 17 00:00:00 2001 From: augustin64 Date: Fri, 15 Dec 2023 10:52:53 +0100 Subject: [PATCH] parser: Add comma --- src/analysis.cpp | 4 ++++ src/include/types.h | 5 +++-- src/parser.cpp | 41 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/analysis.cpp b/src/analysis.cpp index 33ee186..48d1bca 100644 --- a/src/analysis.cpp +++ b/src/analysis.cpp @@ -259,6 +259,10 @@ AnalysisResult analyze(Node &ast, Memory &memory) { return memory.get(identifier).type; } + case NodeType::Comma: { + analyze(node.children[0], memory); + return analyze(node.children[1], memory); + } } } throw exception(); diff --git a/src/include/types.h b/src/include/types.h index 9718b5c..ba75bd5 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -47,7 +47,7 @@ ExprStatement -> | Type ParIdentifier // Declaration -Expr -> Comp +Expr -> Comp, Expr | Comp Comp -> | Sum @@ -129,7 +129,8 @@ enum class NodeType { Eq, // -> Sum == Comp Neq, // -> Sum != Comp Land, // -> Sum && Comp - Lor // -> Sum || Comp + Lor, // -> Sum || Comp + Comma // -> Comp, Expr }; struct InnerNode; diff --git a/src/parser.cpp b/src/parser.cpp index 892f7fc..936cdc6 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -17,7 +17,7 @@ CodePosition null_pos = { const char* _debug_ast_node_names[] = { "Prog", "Epsilon", "AssignedDeclaration", "Declaration", "Plus", "Minus", "Mult", "Div", "Mod", "UnaryMinus", "UnaryPlus", "Neg", "Assignment", "LIncr", "RIncr", "LDecr", "RDecr", "If", "IfElse", - "For", "While", "Bloc", "Lt", "Gt", "Leq", "Geq", "Eq", "Neq", "Land", "Lor" + "For", "While", "Bloc", "Lt", "Gt", "Leq", "Geq", "Eq", "Neq", "Land", "Lor", "Comma" }; void _debug_print_tree(const Node& node, int depth, const string& prefix) { if (holds_alternative(node)) { @@ -427,7 +427,44 @@ ParseReturn parse_expr_statement(vector tokens) { } ParseReturn parse_expr(vector tokens) { - return parse_comp(tokens); + if (tokens.size() == 0) + throw ParseException(); + + // At least 1 Term + ParseReturn ret = parse_comp(tokens); + tokens = ret.tokens; + + Node node = ret.node; + + //* We construct a tree + while (tokens.size() != 0 && tokens.back().type == TokenType::Comma) { + Token last_token; + try { + last_token = tokens.back(); + tokens.pop_back(); + + ParseReturn ret = parse_comp(tokens); + tokens = ret.tokens; + + InnerNode new_node = { + .type=NodeType::Comma, + .children={node, ret.node}, + .pos=last_token.pos + }; + node = new_node; + } catch (const ParseException& pex) { + tokens.emplace_back(last_token); + return { + .node=node, + .tokens=tokens + }; + } + } + + return { + .node=node, + .tokens=tokens + }; } ParseReturn parse_comp(vector tokens) {