Browse Source

parser: feat: `@location`

gretmn102 3 years ago
parent
commit
e77abbae69
3 changed files with 33 additions and 5 deletions
  1. 30 5
      QSParse/ParserExpr.fs
  2. 2 0
      QSParse/Tokens.fs
  3. 1 0
      QspServer/Program.fs

+ 30 - 5
QSParse/ParserExpr.fs

@@ -21,7 +21,7 @@ let pstringIdent =
     let isIdentifierFirstChar c = isLetter c || c = '_' || c = '#'
     let ident = many1Satisfy2L isIdentifierFirstChar isIdentifierChar "identifier"
     let varType =
-        appendToken TokenType.Variable (pchar '$') >>% StringType
+        appendToken TokenType.KeywordSymbol (pchar '$') >>% StringType
     varType .>>. applyRange ident
 
 /// берёт только то, что начинается с `$`
@@ -79,14 +79,15 @@ let term expr =
                 | None ->
                     "Пользовательская глобальная переменная числового типа"
     let pterm, ptermRef = createParserForwardedToRef()
+    let pBracesArgs =
+        bet_ws '(' ')' (sepBy expr (pchar ',' >>. ws))
     let pcallFuncOrArrOrVar =
         let pbraket =
             between
                 (appendToken TokenType.BraceSquareOpened (pchar '[' .>> ws))
                 (appendToken TokenType.BraceSquareClosed (pchar ']'))
                 (sepBy expr (skipChar ',' >>. ws))
-        let pBracesArgs =
-            bet_ws '(' ')' (sepBy expr (pchar ',' >>. ws))
+
         let pcallFunctionOrArrOrVar =
             let pnumericVar =
                 applyRange notFollowedByBinOpIdent |>> fun x -> NumericType, x
@@ -189,8 +190,32 @@ let term expr =
                 (pint32 |>> Int)
         ]
         |>> Val
-    ptermRef := pval <|> pcallFuncOrArrOrVar
-    pval <|> pcallFuncOrArrOrVar <|> bet_ws '(' ')' expr
+    let pDirectCallFunc =
+        appendToken TokenType.KeywordSymbol (pchar '@')
+        >>. ws >>. applyRange notFollowedByBinOpIdent
+        .>> ws .>>. (pBracesArgs <|> (pterm |>> List.singleton) <|>% [])
+        >>= fun ((r, locName), args) ->
+            let locNameLower = String.toLower locName
+            appendLocHighlight r locNameLower VarHighlightKind.ReadAccess
+            >>. pGetDefLocPos locNameLower
+                >>= function
+                    | None ->
+                        updateUserState (fun st ->
+                            { st with
+                                NotDefinedLocs =
+                                    st.NotDefinedLocs
+                                    |> Map.addOrMod locNameLower [r] (fun xs -> r::xs)
+                            }
+                        )
+                    | Some _ -> preturn ()
+            >>% Func(Predef Defines.Func, Val (String [[StringKind locName]])::args)
+    ptermRef :=
+        choice [
+            pval
+            pDirectCallFunc
+            pcallFuncOrArrOrVar
+        ]
+    pterm <|> bet_ws '(' ')' expr
 
 let pExprOld : _ Parser =
     let opp = new OperatorPrecedenceParser<Expr, unit, _>()

+ 2 - 0
QSParse/Tokens.fs

@@ -23,6 +23,8 @@ type TokenType =
     /// в TS `var` называется `storage.type.js`
     | Type
     | Keyword
+    /// `keyword.symbol.fsharp`
+    | KeywordSymbol
 
     | SharpBeginLoc
     | MinusEndLoc

+ 1 - 0
QspServer/Program.fs

@@ -69,6 +69,7 @@ module CommandResponse =
             | Type -> "storage"
             | Variable -> "variable"
             | Keyword -> "keyword"
+            | KeywordSymbol -> "keywordSymbol"
             | Comment -> "comment"
             | Function -> "function"
             | If