From 42f3742fe714e6b342b5150e66d11ff8d3fd3dd3 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Tue, 29 Nov 2022 01:51:02 +0800 Subject: [PATCH] multiline support --- src/compiler.h | 5 +++-- src/parser.h | 5 ++++- tests/multiline.py | 27 +++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 tests/multiline.py diff --git a/src/compiler.h b/src/compiler.h index 29abe8eb..e9d57295 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -471,9 +471,9 @@ public: } void exprGrouping() { - matchNewLines(); + matchNewLines(mode()==SINGLE_MODE); EXPR_TUPLE(); - matchNewLines(); + matchNewLines(mode()==SINGLE_MODE); consume(TK(")")); } @@ -525,6 +525,7 @@ __LISTCOMP: emitCode(OP_JUMP_ABSOLUTE, loop.start); keepOpcodeLine(); patchJump(patch); exitLoop(); + matchNewLines(mode()==SINGLE_MODE); consume(TK("]")); } diff --git a/src/parser.h b/src/parser.h index 7b9fb814..3b9ed41f 100644 --- a/src/parser.h +++ b/src/parser.h @@ -106,6 +106,7 @@ struct Parser { int brackets_level_0 = 0; int brackets_level_1 = 0; + int brackets_level_2 = 0; Token nextToken(){ if(nexts.empty()) return makeErrToken(); @@ -141,7 +142,7 @@ struct Parser { } bool eatIndentation(){ - if(brackets_level_0 > 0 || brackets_level_1 > 0) return true; + if(brackets_level_0 > 0 || brackets_level_1 > 0 || brackets_level_2 > 0) return true; int spaces = eatSpaces(); // https://docs.python.org/3/reference/lexical_analysis.html#indentation if(spaces > indents.top()){ @@ -271,6 +272,8 @@ struct Parser { case TK(")"): brackets_level_0--; break; case TK("["): brackets_level_1++; break; case TK("]"): brackets_level_1--; break; + case TK("{"): brackets_level_2++; break; + case TK("}"): brackets_level_2--; break; } nexts.push( Token{ diff --git a/tests/multiline.py b/tests/multiline.py new file mode 100644 index 00000000..49834bc8 --- /dev/null +++ b/tests/multiline.py @@ -0,0 +1,27 @@ +a = [ + 1,2,3, + 4,5,6 +] + +assert sum(a) == 21 + +c = [ + i for i in range(10) + if i % 2 == 0 +] + +assert sum(c) == 20 + +d = ( + 1,2,3 +) + +assert sum(d) == 6 + +b = { + 'a': 1, + 'b': 2, + 'c': 3 +} + +assert sum(b.values()) == 6 \ No newline at end of file