pavone@154: { pavone@154: startArr <- "[" byte: 0 pavone@154: endArr <- "]" byte: 0 pavone@154: startObj <- "{" byte: 0 pavone@154: endObj <- "}" byte: 0 pavone@154: quote <- "\"" byte: 0 pavone@154: esc <- "\\" byte: 0 pavone@154: zero <- "0" byte: 0 pavone@154: nine <- "9" byte: 0 pavone@154: neg <- "-" byte: 0 pavone@154: space <- " " byte: 0 pavone@154: comma <- "," byte: 0 pavone@169: period <- "." byte: 0 pavone@167: tab <- " " byte: 0 pavone@166: nl <- "\n" byte: 0 pavone@166: cr <- "\r" byte: 0 pavone@154: colon <- ":" byte: 0 pavone@165: t <- "t" byte: 0 pavone@165: f <- "f" byte: 0 pavone@154: pavone@154: parseNumAt <- :str :at :recvResult { pavone@154: num <- 0 pavone@154: l <- str length pavone@154: minus <- false pavone@154: aft <- -1 pavone@169: ignore <- false pavone@154: while: { at < l } do: { pavone@154: b <- str byte: at pavone@154: if: b = neg { pavone@154: minus <- true pavone@154: } else: { pavone@169: if: b = period { pavone@169: ignore <- true pavone@154: } else: { pavone@169: if: b >= zero && b <= nine { pavone@169: if: (not: ignore) { pavone@169: num <- num * 10 + (str byte: at) - zero pavone@169: } pavone@169: } else: { pavone@169: aft <- at pavone@169: at <- l pavone@169: } pavone@154: } pavone@154: } pavone@154: at <- at + 1 pavone@154: } pavone@154: if: aft < 0 { pavone@154: aft <- at pavone@154: } pavone@154: if: minus { pavone@154: num <- 0 - num pavone@154: } pavone@154: #{ pavone@154: value <- num pavone@154: after <- aft pavone@154: } pavone@154: } pavone@154: pavone@154: parseStrAt <- :src :at :recvResult { pavone@154: //TODO: Deal with escaped characters pavone@154: end <- src find: "\"" startingAt: at + 1 else: { src length } pavone@154: #{ pavone@154: value <- src from: (at + 1) withLength: (end - at - 1) pavone@154: after <- end + 1 pavone@154: } pavone@154: } pavone@154: pavone@154: _decode:at <- :text :cur { pavone@154: ret <- false pavone@154: b <- text byte: cur pavone@154: if: b = neg || b >= zero && b <= nine { pavone@154: text parseNumAt: cur pavone@154: } else: { pavone@154: if: b = quote { pavone@154: text parseStrAt: cur pavone@154: } else: { pavone@154: if: b = startArr { pavone@154: len <- text length pavone@154: val <- #[] pavone@154: cur <- cur + 1 pavone@154: aft <- -1 pavone@154: while: { cur < len } do: { pavone@154: b <- text byte: cur pavone@154: if: b = endArr { pavone@154: aft <- cur + 1 pavone@154: cur <- len pavone@154: } else: { pavone@166: if: b = comma || b = space || b = tab || b = nl || b = cr { pavone@154: cur <- cur + 1 pavone@154: } else: { pavone@154: el <- _decode: text at: cur pavone@154: cur <- el after pavone@154: val append: (el value) pavone@154: } pavone@154: } pavone@154: } pavone@154: #{ pavone@154: value <- val pavone@154: after <- aft pavone@154: } pavone@154: } else: { pavone@154: if: b = startObj { pavone@154: len <- text length pavone@154: val <- dict linear pavone@154: cur <- cur + 1 pavone@154: aft <- -1 pavone@154: expectKey <- true pavone@154: key <- "" pavone@154: while: { cur < len } do: { pavone@154: b <- text byte: cur pavone@166: if: b = comma || b = space || b = tab || b = colon || b = nl || b = cr { pavone@154: cur <- cur + 1 pavone@154: } else: { pavone@154: if: expectKey { pavone@154: if: b = endObj { pavone@154: aft <- cur + 1 pavone@154: cur <- len pavone@154: } else: { pavone@154: kd <- _decode: text at: cur pavone@154: key <- kd value pavone@154: cur <- kd after pavone@167: pavone@154: expectKey <- false pavone@154: } pavone@154: } else: { pavone@154: el <- _decode: text at: cur pavone@154: val set: key (el value) pavone@154: cur <- el after pavone@154: expectKey <- true pavone@154: } pavone@154: } pavone@154: } pavone@154: #{ pavone@154: after <- aft pavone@154: value <- val pavone@154: } pavone@154: } else: { pavone@165: if: b = t && (text from: cur withLength: 4) = "true" { pavone@165: #{ pavone@165: value <- true pavone@165: after <- cur + 4 pavone@165: } pavone@165: } else: { pavone@165: if: b = f && (text from: cur withLength: 5) = "false" { pavone@165: #{ pavone@165: value <- false pavone@165: after <- cur + 5 pavone@165: } pavone@165: } else: { pavone@165: #{ pavone@165: value <- "foobar" pavone@165: after <- (text length) pavone@165: } pavone@165: } pavone@154: } pavone@165: pavone@154: } pavone@154: } pavone@154: } pavone@154: } pavone@154: } pavone@154: #{ pavone@154: decode <- :text { pavone@154: (_decode: text at: 0) value pavone@154: } pavone@154: } pavone@154: }