Kaynağa Gözat

parser: underscore in expressions

gretmn102 3 yıl önce
ebeveyn
işleme
ed99beca5a
3 değiştirilmiş dosya ile 21 ekleme ve 2 silme
  1. 3 0
      QSParse/ParserExpr.fs
  2. 1 1
      TODO
  3. 17 1
      Test/Test.fs

+ 3 - 0
QSParse/ParserExpr.fs

@@ -78,6 +78,9 @@ let notFollowedByBinOpIdent =
     // runStateEither p2 emptyState "node" // можно
     // runStateEither p2 emptyState "foobar" // можно
     p2
+let ws =
+    ws
+    >>. skipMany (pchar '_' >>? ((ws1 >>? skipNewline) <|> skipNewline) >>. spaces)
 
 let term expr =
     let pcallFuncOrArrOrVar =

+ 1 - 1
TODO

@@ -1,6 +1,6 @@
 Синтаксис:
     ✔ Однострочный `else` @done(20-07-06 20:37)
-    ☐ `_` в выражениях
+    ✔ `_` в выражениях @done(20-08-12 20:59)
     ☐ `if x = 10: ! comment`
     ☐ Вызов процедуры `The(Lady), 'or', the, Tiger`. Сейчас такое `*p(Lady), 'or', the, Tiger` работает
     ✔ Допускать на уровне синтаксиса неопределенные процедуры со звездочкой (например, `*proc`), а уже на уровне семантики запрещать @done

+ 17 - 1
Test/Test.fs

@@ -98,6 +98,22 @@ let pexprTest =
               (Plus, UnarExpr (Neg, Var (ImplicitNumericType, "x")),
                UnarExpr (Neg, Var (ImplicitNumericType, "y")))
         testf input exp
+
+        let input =
+            [
+                "x + _"
+                "         "
+                "         _"
+                "    _"
+                ""
+                "    z + y"
+            ] |> String.concat "\n"
+        let exp =
+            Expr
+              (Plus,
+               Expr (Plus, Var (ImplicitNumericType, "x"), Var (ImplicitNumericType, "z")),
+               Var (ImplicitNumericType, "y"))
+        testf input exp
     ]
 // #load "Parsec.fs"
 
@@ -189,7 +205,7 @@ let assignTest =
                     "  Error in Ln: 1 Col: 2"
                     "  f(expr) = 42"
                     "   ^"
-                    "  Expecting: '+=', '-=', '=', '=+', '=-' or '['"
+                    "  Expecting: '+=', '-=', '=', '=+', '=-', '[' or '_'"
                     ""
                 ] |> String.concat "\r\n"
             Assert.Equal("", Left exp, runExpr input)