ソースを参照

parser: fix: $func

gretmn102 3 年 前
コミット
00a74104ea
5 ファイル変更24 行追加6 行削除
  1. 2 1
      .gitignore
  2. 8 0
      QSParse/Defines.fs
  3. 1 1
      QSParse/Parsec.fs
  4. 2 2
      QSParse/ParserExpr.fs
  5. 11 2
      QSParse/Show.fs

+ 2 - 1
.gitignore

@@ -397,4 +397,5 @@ paket-files/
 
 /Test/Mocks/
 
-/RunUtils.cmd
+/RunUtils.cmd
+/Sandbox.fsx

+ 8 - 0
QSParse/Defines.fs

@@ -780,10 +780,18 @@ let functions =
             ] |> String.concat "\n"
         Selact, dscr, unit' String
     ]
+let functionBySymbolic =
+    functions
+    |> List.map (fun (name, dscr, sign) ->
+        name, {| SymbolicName = name; Description = dscr; Signature = sign |})
+    |> Map.ofList
+let functionsByName =
+    functions
     |> List.map (fun (name, dscr, sign) ->
         let stringName = (string name).ToLower()
         stringName, {| SymbolicName = name; Description = dscr; Signature = sign |})
     |> Map.ofList
+
 /// Да-да, всё это — процедуры: они что-то выполняют и никуда не перемещают.
 let procedures =
     [

+ 1 - 1
QSParse/Parsec.fs

@@ -24,7 +24,7 @@ let pImplicitVarWhenAssign p =
             | None ->
                 if Map.containsKey nameLower Defines.procs then
                     appendSemanticError range "Нельзя переопределять процедуру"
-                elif Map.containsKey nameLower Defines.functions then
+                elif Map.containsKey nameLower Defines.functionsByName then
                     appendSemanticError range "Нельзя переопределять функцию"
                 else
                     let dscr = "Пользовательская глобальная переменная числового типа"

+ 2 - 2
QSParse/ParserExpr.fs

@@ -166,10 +166,10 @@ let term expr =
                     f (varType, name) range
 
         let pPreDefFunc =
-            Defines.functions
+            Defines.functionsByName
             |> Seq.sortByDescending (fun (KeyValue(name, _)) -> name) // для жадности
             |> Seq.map (fun (KeyValue(name, x)) ->
-                applyRange (pstringCI name .>>? notFollowedVarCont)
+                applyRange (opt (pchar '$') >>? pstringCI name .>>? notFollowedVarCont)
                 >>= fun (range, name) ->
                     appendToken2 TokenType.Function range
                     >>. appendHover2 x.Description range

+ 11 - 2
QSParse/Show.fs

@@ -81,8 +81,17 @@ let ops = Op.toString >> showString
 let unar = function No -> "no" | Obj -> "obj" | Neg -> "-" | Loc -> "loc"
 let showFuncName = function
     | PredefUndef.Predef name ->
-        let name = (string name).ToLower()
-        showString name
+        match Map.tryFind name Qsp.Defines.functionBySymbolic with
+        | Some x ->
+            let _, returnedType = x.Signature
+            let returnedType =
+                match returnedType with
+                | Defines.Numeric -> id
+                | Defines.String -> showChar '$'
+                | Defines.Any -> id // TODO: defines by argument type
+            let nameStr = (string name).ToLower()
+            returnedType << showString nameStr
+        | None -> failwithf "%A not found in `functionBySymbolic`" name
     | PredefUndef.Undef name ->
         showString name
 let rec simpleShowExpr showStmtsInline expr : ShowS =