Sha256: 81ad848c88d2ee112a60ab08f65dde0bb711d7b53ab1d5e4c6ed3164ea22ad76

Contents?: true

Size: 1.28 KB

Versions: 396

Compression:

Stored size: 1.28 KB

Contents

module SgfParsing

open FParsec

type Data = Map<string, string list>
type Tree = Node of Data * Tree list

let mkTree node children = Node (node, children)

let propertyToData = 
    function 
    | Some (prop, values) -> Map.ofList [(prop, values)]
    | None -> Map.empty

let rec nodesToTree (nodes, trees) = 
    match nodes with
    | [] -> failwith "Can only create tree from non-empty nodes list"
    | x::[] -> Node (x, trees)
    | x::xs -> Node (x, [nodesToTree (xs, trees)])

// We create a parser forwarder in order to allow us to 
// define a recursive parser later on
let expr, exprImpl = createParserForwardedToRef()

let normalChar = satisfy (fun c -> c <> '\\' && c <> ']')
let unescape =
    function
    | 'n' | 'r' | 't' -> ' '
    | c -> c
let escapedChar = pchar '\\' >>. (anyChar |>> unescape)
let cValueType = manyChars (normalChar <|> escapedChar)
let propValue = between (pchar '[') (pchar ']') cValueType
let propIdent = asciiUpper
let property = (propIdent |>> string) .>>. many propValue
let node = (pchar ';') >>. opt property |>> propertyToData
let gameTree = (pchar '(') >>. (many1 node) .>>. (many expr) .>> (pchar ')') |>> nodesToTree

exprImpl := gameTree

let parseSgf sgf = 
    match run gameTree sgf with
    | Success (result, _, _) -> Some result
    | Failure _ -> None

Version data entries

396 entries across 396 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.179 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.178 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.177 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.176 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.175 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.174 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.173 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.172 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.171 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.170 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.169 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.167 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.166 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.165 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.164 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.163 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.162 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.161 tracks/fsharp/exercises/sgf-parsing/Example.fs
trackler-2.2.1.160 tracks/fsharp/exercises/sgf-parsing/Example.fs