blueloveTH 2 лет назад
Родитель
Сommit
1898c8a434
2 измененных файлов с 35 добавлено и 22 удалено
  1. 23 21
      src/lexer.h
  2. 12 1
      tests/99_bugs.py

+ 23 - 21
src/lexer.h

@@ -231,25 +231,6 @@ struct Lexer {
         }
 
         if(kTokenKwMap.count(name)){
-            if(name == "not"){
-                if(strncmp(curr_char, " in", 3) == 0){
-                    curr_char += 3;
-                    add_token(TK("not in"));
-                    return 0;
-                }
-            }else if(name == "is"){
-                if(strncmp(curr_char, " not", 4) == 0){
-                    curr_char += 4;
-                    add_token(TK("is not"));
-                    return 0;
-                }
-            }else if(name == "yield"){
-                if(strncmp(curr_char, " from", 5) == 0){
-                    curr_char += 5;
-                    add_token(TK("yield from"));
-                    return 0;
-                }
-            }
             add_token(kTokenKwMap.at(name));
         } else {
             add_token(TK("@id"));
@@ -276,13 +257,34 @@ struct Lexer {
             case TK("{"): case TK("["): case TK("("): brackets_level++; break;
             case TK(")"): case TK("]"): case TK("}"): brackets_level--; break;
         }
-        nexts.push_back( Token{
+        auto token = Token{
             type,
             token_start,
             (int)(curr_char - token_start),
             current_line - ((type == TK("@eol")) ? 1 : 0),
             value
-        });
+        };
+        // handle "not in", "is not", "yield from"
+        if(!nexts.empty()){
+            switch(nexts.back().type){
+                case TK("not"):
+                    if(type == TK("in")) {
+                        nexts.back().type = TK("not in");
+                        return;
+                    }
+                case TK("is"):
+                    if(type == TK("not")){
+                        nexts.back().type = TK("is not");
+                        return;
+                    }
+                case TK("yield"):
+                    if(type == TK("from")){
+                        nexts.back().type = TK("yield from");
+                        return;
+                    }
+                default: nexts.push_back(token); return;
+            }
+        }
     }
 
     void add_token_2(char c, TokenIndex one, TokenIndex two) {

+ 12 - 1
tests/99_bugs.py

@@ -18,4 +18,15 @@ b = [3, 4]
 assert a.append == a.append
 assert a.append is not a.append
 assert a.append is not b.append
-assert a.append != b.append
+assert a.append != b.append
+
+inq = 0
+if not inq:
+    assert True
+else:
+    assert False
+
+if inq is   not 1:
+    assert True
+if inq  is  not  0:
+    assert False