Bläddra i källkod

multiline support

blueloveTH 3 år sedan
förälder
incheckning
42f3742fe7
3 ändrade filer med 34 tillägg och 3 borttagningar
  1. 3 2
      src/compiler.h
  2. 4 1
      src/parser.h
  3. 27 0
      tests/multiline.py

+ 3 - 2
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("]"));
     }
 

+ 4 - 1
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{

+ 27 - 0
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