Skip to content

Commit 8b1263c

Browse files
committed
Revert "Make it possible to nest match-expressions"
This reverts commit ac7467b. The commit breaks too much syntax.
1 parent ac7467b commit 8b1263c

File tree

5 files changed

+31
-102
lines changed

5 files changed

+31
-102
lines changed

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"request": "launch",
1010
"name": "Debug",
1111
"program": "${workspaceFolder}/build/bolt",
12-
"args": [ "--direct-diagnostics", "check", "test.bolt" ],
12+
"args": [ "--direct-diagnostics", "verify", "test/checker/wrong_return_type.bolt" ],
1313
"cwd": "${workspaceFolder}",
1414
"preLaunchTask": "CMake: build"
1515
}

include/bolt/Parser.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,6 @@ namespace bolt {
9999
void checkLineFoldEnd();
100100
void skipToLineFoldEnd();
101101

102-
void disablePunctuation();
103-
void enablePunctuation();
104-
105102
public:
106103

107104
Parser(TextFile& File, Stream<Token*>& S, DiagnosticEngine& DE);

include/bolt/Scanner.hpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,25 +61,16 @@ namespace bolt {
6161
enum class FrameType {
6262
Block,
6363
LineFold,
64-
};
65-
66-
struct Frame {
67-
FrameType Type;
68-
int Parens = 0;
69-
int Braces = 0;
70-
int Brackets = 0;
64+
Fallthrough,
7165
};
7266

7367
class Punctuator : public BufferedStream<Token*> {
7468

7569
Stream<Token*>& Tokens;
7670

77-
std::stack<Frame> Frames;
71+
std::stack<FrameType> Frames;
7872
std::stack<TextLoc> Locations;
7973

80-
bool ShouldYieldNextTokenInLineFold = false;
81-
bool isTerminal(NodeKind Kind);
82-
8374
protected:
8475

8576
virtual Token* read() override;

src/Parser.cc

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -492,8 +492,8 @@ namespace bolt {
492492
}
493493

494494
MatchExpression* Parser::parseMatchExpression() {
495-
auto Match = expectToken<MatchKeyword>();
496-
if (!Match) {
495+
auto T0 = expectToken<MatchKeyword>();
496+
if (!T0) {
497497
return nullptr;
498498
}
499499
auto T1 = Tokens.peek();
@@ -506,12 +506,12 @@ namespace bolt {
506506
} else {
507507
Value = parseExpression();
508508
if (!Value) {
509-
Match->unref();
509+
T0->unref();
510510
return nullptr;
511511
}
512512
BlockStart = expectToken<class BlockStart>();
513513
if (!BlockStart) {
514-
Match->unref();
514+
T0->unref();
515515
Value->unref();
516516
return nullptr;
517517
}
@@ -544,7 +544,7 @@ namespace bolt {
544544
checkLineFoldEnd();
545545
Cases.push_back(new MatchCase { Pattern, RArrowAlt, Expression });
546546
}
547-
return new MatchExpression(Match, Value, BlockStart, Cases);
547+
return new MatchExpression(static_cast<MatchKeyword*>(T0), Value, BlockStart, Cases);
548548
}
549549

550550
RecordExpression* Parser::parseRecordExpression() {
@@ -688,13 +688,10 @@ namespace bolt {
688688
case NodeKind::LineFoldEnd:
689689
case NodeKind::BlockStart:
690690
case NodeKind::EndOfFile:
691+
// Can recover from this one
692+
RParen = nullptr;
691693
DE.add<UnexpectedTokenDiagnostic>(File, T2, std::vector { NodeKind::RParen, NodeKind::Comma });
692-
LParen->unref();
693-
for (auto [E, Comma]: Elements) {
694-
E->unref();
695-
Comma->unref();
696-
}
697-
return nullptr;
694+
goto after_tuple_elements;
698695
}
699696
}
700697
after_tuple_elements:
@@ -767,7 +764,6 @@ namespace bolt {
767764
if (T1->getKind() == NodeKind::LineFoldEnd
768765
|| T1->getKind() == NodeKind::RParen
769766
|| T1->getKind() == NodeKind::RBrace
770-
|| T1->getKind() == NodeKind::RBracket
771767
|| T1->getKind() == NodeKind::BlockStart
772768
|| T1->getKind() == NodeKind::Comma
773769
|| ExprOperators.isInfix(T1)) {

src/Scanner.cc

Lines changed: 20 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -426,77 +426,17 @@ namespace bolt {
426426

427427
Punctuator::Punctuator(Stream<Token*>& Tokens):
428428
Tokens(Tokens) {
429-
Frames.push({ FrameType::Block });
429+
Frames.push(FrameType::Block);
430430
Locations.push(TextLoc { 0, 0 });
431431
}
432432

433-
static bool isCloseDelim(NodeKind Kind) {
434-
switch (Kind) {
435-
case NodeKind::RParen:
436-
case NodeKind::RBrace:
437-
case NodeKind::RBracket:
438-
return true;
439-
default:
440-
return false;
441-
}
442-
}
443-
444-
// struct DelimCounter {
445-
// int Parens = 0;
446-
// int Braces = 0;
447-
// int Brackets = 0;
448-
// };
449-
450-
bool Punctuator::isTerminal(NodeKind Kind) {
451-
auto& Frame = Frames.top();
452-
switch (Kind) {
453-
case NodeKind::RParen:
454-
return Frame.Parens == 0;
455-
case NodeKind::RBrace:
456-
return Frame.Braces == 0;
457-
case NodeKind::RBracket:
458-
return Frame.Brackets == 0;
459-
default:
460-
return false;
461-
}
462-
}
463-
464433
Token* Punctuator::read() {
465434

466435
auto T0 = Tokens.peek();
467-
auto& RefLoc = Locations.top();
468-
auto& Frame = Frames.top();
469436

470437
switch (T0->getKind()) {
471-
case NodeKind::LParen:
472-
++Frame.Parens;
473-
break;
474438
case NodeKind::LBrace:
475-
++Frame.Braces;
476-
break;
477-
case NodeKind::LBracket:
478-
++Frame.Brackets;
479-
break;
480-
case NodeKind::RParen:
481-
if (Frame.Parens == 0) {
482-
// TODO add diagnostic?
483-
break;
484-
}
485-
--Frame.Parens;
486-
break;
487-
case NodeKind::RBrace:
488-
if (Frame.Braces == 0) {
489-
// TODO add diagnostic?
490-
break;
491-
}
492-
--Frame.Braces;
493-
break;
494-
case NodeKind::RBracket:
495-
if (Frame.Brackets == 0) {
496-
// TODO add diagnostic?
497-
break;
498-
}
499-
--Frame.Brackets;
439+
Frames.push(FrameType::Fallthrough);
500440
break;
501441
case NodeKind::EndOfFile:
502442
{
@@ -505,7 +445,9 @@ namespace bolt {
505445
}
506446
auto Frame = Frames.top();
507447
Frames.pop();
508-
switch (Frame.Type) {
448+
switch (Frame) {
449+
case FrameType::Fallthrough:
450+
break;
509451
case FrameType::Block:
510452
return new BlockEnd(T0->getStartLoc());
511453
case FrameType::LineFold:
@@ -516,17 +458,20 @@ namespace bolt {
516458
break;
517459
}
518460

519-
switch (Frame.Type) {
520-
case FrameType::LineFold:
461+
auto RefLoc = Locations.top();
462+
switch (Frames.top()) {
463+
case FrameType::Fallthrough:
521464
{
522-
if (ShouldYieldNextTokenInLineFold) {
523-
ShouldYieldNextTokenInLineFold = false;
524-
return Tokens.get();
465+
if (T0->getKind() == NodeKind::RBrace) {
466+
Frames.pop();
525467
}
526-
ShouldYieldNextTokenInLineFold = isTerminal(T0->getKind());
527-
if (ShouldYieldNextTokenInLineFold
528-
|| (T0->getStartLine() > RefLoc.Line
529-
&& T0->getStartColumn() <= RefLoc.Column)) {
468+
Tokens.get();
469+
return T0;
470+
}
471+
case FrameType::LineFold:
472+
{
473+
if (T0->getStartLine() > RefLoc.Line
474+
&& T0->getStartColumn() <= RefLoc.Column) {
530475
Frames.pop();
531476
Locations.pop();
532477
return new LineFoldEnd(T0->getStartLoc());
@@ -535,20 +480,20 @@ namespace bolt {
535480
auto T1 = Tokens.peek(1);
536481
if (T1->getStartLine() > T0->getEndLine()) {
537482
Tokens.get();
538-
Frames.push({ FrameType::Block });
483+
Frames.push(FrameType::Block);
539484
return new BlockStart(T0->getStartLoc());
540485
}
541486
}
542487
return Tokens.get();
543488
}
544489
case FrameType::Block:
545490
{
546-
if (T0->getStartColumn() <= RefLoc.Column || isTerminal(T0->getKind())) {
491+
if (T0->getStartColumn() <= RefLoc.Column) {
547492
Frames.pop();
548493
return new BlockEnd(T0->getStartLoc());
549494
}
550495

551-
Frames.push({ FrameType::LineFold });
496+
Frames.push(FrameType::LineFold);
552497
Locations.push(T0->getStartLoc());
553498

554499
return Tokens.get();

0 commit comments

Comments
 (0)