From 8b1263c37659be84345b93c5814ab9d25df1e735 Mon Sep 17 00:00:00 2001 From: Sam Vervaeck Date: Thu, 15 Jun 2023 16:29:35 +0200 Subject: [PATCH] Revert "Make it possible to nest match-expressions" This reverts commit ac7467bccb77624df00db36dd0d9dbf90691ec4b. The commit breaks too much syntax. --- .vscode/launch.json | 2 +- include/bolt/Parser.hpp | 3 -- include/bolt/Scanner.hpp | 13 +----- src/Parser.cc | 20 ++++----- src/Scanner.cc | 95 +++++++++------------------------------- 5 files changed, 31 insertions(+), 102 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 01d5fa8fb..e81d80199 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "request": "launch", "name": "Debug", "program": "${workspaceFolder}/build/bolt", - "args": [ "--direct-diagnostics", "check", "test.bolt" ], + "args": [ "--direct-diagnostics", "verify", "test/checker/wrong_return_type.bolt" ], "cwd": "${workspaceFolder}", "preLaunchTask": "CMake: build" } diff --git a/include/bolt/Parser.hpp b/include/bolt/Parser.hpp index 954c53da5..777b0dbd4 100644 --- a/include/bolt/Parser.hpp +++ b/include/bolt/Parser.hpp @@ -99,9 +99,6 @@ namespace bolt { void checkLineFoldEnd(); void skipToLineFoldEnd(); - void disablePunctuation(); - void enablePunctuation(); - public: Parser(TextFile& File, Stream& S, DiagnosticEngine& DE); diff --git a/include/bolt/Scanner.hpp b/include/bolt/Scanner.hpp index 343a93762..ba16e276c 100644 --- a/include/bolt/Scanner.hpp +++ b/include/bolt/Scanner.hpp @@ -61,25 +61,16 @@ namespace bolt { enum class FrameType { Block, LineFold, - }; - - struct Frame { - FrameType Type; - int Parens = 0; - int Braces = 0; - int Brackets = 0; + Fallthrough, }; class Punctuator : public BufferedStream { Stream& Tokens; - std::stack Frames; + std::stack Frames; std::stack Locations; - bool ShouldYieldNextTokenInLineFold = false; - bool isTerminal(NodeKind Kind); - protected: virtual Token* read() override; diff --git a/src/Parser.cc b/src/Parser.cc index 1dc34e228..98e6279c2 100644 --- a/src/Parser.cc +++ b/src/Parser.cc @@ -492,8 +492,8 @@ after_tuple_element: } MatchExpression* Parser::parseMatchExpression() { - auto Match = expectToken(); - if (!Match) { + auto T0 = expectToken(); + if (!T0) { return nullptr; } auto T1 = Tokens.peek(); @@ -506,12 +506,12 @@ after_tuple_element: } else { Value = parseExpression(); if (!Value) { - Match->unref(); + T0->unref(); return nullptr; } BlockStart = expectToken(); if (!BlockStart) { - Match->unref(); + T0->unref(); Value->unref(); return nullptr; } @@ -544,7 +544,7 @@ after_tuple_element: checkLineFoldEnd(); Cases.push_back(new MatchCase { Pattern, RArrowAlt, Expression }); } - return new MatchExpression(Match, Value, BlockStart, Cases); + return new MatchExpression(static_cast(T0), Value, BlockStart, Cases); } RecordExpression* Parser::parseRecordExpression() { @@ -688,13 +688,10 @@ after_tuple_element: case NodeKind::LineFoldEnd: case NodeKind::BlockStart: case NodeKind::EndOfFile: + // Can recover from this one + RParen = nullptr; DE.add(File, T2, std::vector { NodeKind::RParen, NodeKind::Comma }); - LParen->unref(); - for (auto [E, Comma]: Elements) { - E->unref(); - Comma->unref(); - } - return nullptr; + goto after_tuple_elements; } } after_tuple_elements: @@ -767,7 +764,6 @@ finish: if (T1->getKind() == NodeKind::LineFoldEnd || T1->getKind() == NodeKind::RParen || T1->getKind() == NodeKind::RBrace - || T1->getKind() == NodeKind::RBracket || T1->getKind() == NodeKind::BlockStart || T1->getKind() == NodeKind::Comma || ExprOperators.isInfix(T1)) { diff --git a/src/Scanner.cc b/src/Scanner.cc index 436666893..61f4e8649 100644 --- a/src/Scanner.cc +++ b/src/Scanner.cc @@ -426,77 +426,17 @@ after_string_contents: Punctuator::Punctuator(Stream& Tokens): Tokens(Tokens) { - Frames.push({ FrameType::Block }); + Frames.push(FrameType::Block); Locations.push(TextLoc { 0, 0 }); } - static bool isCloseDelim(NodeKind Kind) { - switch (Kind) { - case NodeKind::RParen: - case NodeKind::RBrace: - case NodeKind::RBracket: - return true; - default: - return false; - } - } - - // struct DelimCounter { - // int Parens = 0; - // int Braces = 0; - // int Brackets = 0; - // }; - - bool Punctuator::isTerminal(NodeKind Kind) { - auto& Frame = Frames.top(); - switch (Kind) { - case NodeKind::RParen: - return Frame.Parens == 0; - case NodeKind::RBrace: - return Frame.Braces == 0; - case NodeKind::RBracket: - return Frame.Brackets == 0; - default: - return false; - } - } - Token* Punctuator::read() { auto T0 = Tokens.peek(); - auto& RefLoc = Locations.top(); - auto& Frame = Frames.top(); switch (T0->getKind()) { - case NodeKind::LParen: - ++Frame.Parens; - break; case NodeKind::LBrace: - ++Frame.Braces; - break; - case NodeKind::LBracket: - ++Frame.Brackets; - break; - case NodeKind::RParen: - if (Frame.Parens == 0) { - // TODO add diagnostic? - break; - } - --Frame.Parens; - break; - case NodeKind::RBrace: - if (Frame.Braces == 0) { - // TODO add diagnostic? - break; - } - --Frame.Braces; - break; - case NodeKind::RBracket: - if (Frame.Brackets == 0) { - // TODO add diagnostic? - break; - } - --Frame.Brackets; + Frames.push(FrameType::Fallthrough); break; case NodeKind::EndOfFile: { @@ -505,7 +445,9 @@ after_string_contents: } auto Frame = Frames.top(); Frames.pop(); - switch (Frame.Type) { + switch (Frame) { + case FrameType::Fallthrough: + break; case FrameType::Block: return new BlockEnd(T0->getStartLoc()); case FrameType::LineFold: @@ -516,17 +458,20 @@ after_string_contents: break; } - switch (Frame.Type) { + auto RefLoc = Locations.top(); + switch (Frames.top()) { + case FrameType::Fallthrough: + { + if (T0->getKind() == NodeKind::RBrace) { + Frames.pop(); + } + Tokens.get(); + return T0; + } case FrameType::LineFold: { - if (ShouldYieldNextTokenInLineFold) { - ShouldYieldNextTokenInLineFold = false; - return Tokens.get(); - } - ShouldYieldNextTokenInLineFold = isTerminal(T0->getKind()); - if (ShouldYieldNextTokenInLineFold - || (T0->getStartLine() > RefLoc.Line - && T0->getStartColumn() <= RefLoc.Column)) { + if (T0->getStartLine() > RefLoc.Line + && T0->getStartColumn() <= RefLoc.Column) { Frames.pop(); Locations.pop(); return new LineFoldEnd(T0->getStartLoc()); @@ -535,7 +480,7 @@ after_string_contents: auto T1 = Tokens.peek(1); if (T1->getStartLine() > T0->getEndLine()) { Tokens.get(); - Frames.push({ FrameType::Block }); + Frames.push(FrameType::Block); return new BlockStart(T0->getStartLoc()); } } @@ -543,12 +488,12 @@ after_string_contents: } case FrameType::Block: { - if (T0->getStartColumn() <= RefLoc.Column || isTerminal(T0->getKind())) { + if (T0->getStartColumn() <= RefLoc.Column) { Frames.pop(); return new BlockEnd(T0->getStartLoc()); } - Frames.push({ FrameType::LineFold }); + Frames.push(FrameType::LineFold); Locations.push(T0->getStartLoc()); return Tokens.get();