Size: a a a

2020 June 18

hs

habib sadullaev in F# Chat
нет
источник

hs

habib sadullaev in F# Chat
let dfProp = parser |>> (fun str node -> DfProp str node)
источник

hs

habib sadullaev in F# Chat
более конкретно:
let dfProp = returnString "common" (fun str node -> DFProp(str, node))
источник

hs

habib sadullaev in F# Chat
ну, там наоборот
источник

hs

habib sadullaev in F# Chat
let dfProp = nodeParser (fun node str -> DFProp(str, node))
источник

hs

habib sadullaev in F# Chat
вот так
источник

VS

Vladimir Shchur in F# Chat
вот примеры того что распарсить:
abcd: "xxx"
dbca {
  aaa: 1
  bbb {
  }
}
abcd и dcba это common
источник

hs

habib sadullaev in F# Chat
ща
источник

VS

Vladimir Shchur in F# Chat
вот короче весь мой код нынешний)
    let dfProperty =
       manyCharsTill (noneOf <| seq { '{'; '}'; ' ' }) (skipString ": ") .>>. dfLiteral .>> spaces
       |>> DFProperty
   
   let dfObject =
       manyCharsTill (noneOf <| seq { ':'; '}'; ' ' }) (skipString " {") .>> spaces .>>. (many dfNode) .>> (skipString "}") .>> spaces
       |>> DFObject

   do dfNodeRef := choice [
       attempt dfProperty
       attempt dfObject
   ]
источник

hs

habib sadullaev in F# Chat
let ident = identifier(IdentifierOptions())

let common =
   ident .>> spaces

let value =
   between (pstring "") (pstring "") ident
   |>> fun _ -> Value

let prop =
   value |>> fun node str -> Prop (str, node "")
   
let obj =
   pchar ':' >>. spaces >>.
   many (between (pstring "{") (pstring "}") value) .>> spaces
   |>> fun nodes str -> Obj (str, (nodes |> List.map (fun f -> f "")))

let node: Parser<_, unit> = (pipe2 common (choice [obj; prop; value]) (|>))
источник

hs

habib sadullaev in F# Chat
вот
источник

hs

habib sadullaev in F# Chat
правда, не проверял
источник

VS

Vladimir Shchur in F# Chat
habib sadullaev
let ident = identifier(IdentifierOptions())

let common =
   ident .>> spaces

let value =
   between (pstring "") (pstring "") ident
   |>> fun _ -> Value

let prop =
   value |>> fun node str -> Prop (str, node "")
   
let obj =
   pchar ':' >>. spaces >>.
   many (between (pstring "{") (pstring "}") value) .>> spaces
   |>> fun nodes str -> Obj (str, (nodes |> List.map (fun f -> f "")))

let node: Parser<_, unit> = (pipe2 common (choice [obj; prop; value]) (|>))
спасибо, идея вроде понятна, но не смог сделать чтобы заработало
источник

hs

habib sadullaev in F# Chat
type DFNode =
   | DFLiteral of string
   | DFProperty of string * DFNode
   | DFObject of string * DFNode list

let dfNode, dfNodeRef = createParserForwardedToRef()

let ident = identifier(IdentifierOptions())

let dfLiteral =
   between (pchar '"') (pchar '"') ident .>> spaces |>> DFLiteral

let dfProperty =
   pchar ':' >>. spaces1 >>. dfLiteral .>> spaces |>> (fun node str -> DFProperty (str, node))
   
let dfObject =
   between (pchar '{' .>> spaces)  (pchar '}' .>> spaces) (many dfNode)
   |>> (fun node str -> DFObject (str, node))

do dfNodeRef := pipe2 common  (dfProperty <|> dfObject) (|>)
источник

hs

habib sadullaev in F# Chat
источник

VS

Vladimir Shchur in F# Chat
работает, спасибо) я когда написал что не заработало не смог понять почему валилось, а валилось потому что я оборачивал в _root_ а _ уже невалидный символ для идентификатора
источник

hs

habib sadullaev in F# Chat
ясно
источник

hs

habib sadullaev in F# Chat
а то я уже протестил)
источник

hs

habib sadullaev in F# Chat
вот:
источник

hs

habib sadullaev in F# Chat
type DFNode =
   | DFLiteral of string
   | DFProperty of string * DFNode
   | DFObject of string * DFNode list

let dfNode, dfNodeRef = createParserForwardedToRef ()

let ident: Parser<_, unit> = identifier (IdentifierOptions())

let dfLiteral =
   between (pchar '"') (pchar '"') ident
   |>> DFLiteral

let dfProperty =
   pchar ':' >>. spaces >>. dfLiteral
   |>> fun node str -> DFProperty(str, node)

let dfObject =
   between (pchar '{' .>> spaces) (spaces >>. pchar '}') (many dfNode)
   |>> fun node str -> DFObject(str, node)

do dfNodeRef :=
   spaces >>. pipe2 (ident .>> spaces) (dfProperty <|> dfObject) (|>) <|> dfLiteral .>> spaces

let test p i =
   match run (p .>> eof) i with
   | Success (v, _, _) -> printfn "%A" v
   | Failure (e, _, _) -> printfn "%s" e

let x1 = "abcd: \"xxx\""

let x2 = """
dbca {
   "xxx"
   "yyy"
}
"""

test dfNode x1
test dfNode x2
источник