Mercurial > repos > tabletprog
annotate modules/json.tp @ 165:fe816637fcc4
Add support for parsing true and false to JSON parser
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 11 Aug 2013 00:58:50 -0700 |
parents | 6e579a75a0a9 |
children | e7642715d575 |
rev | line source |
---|---|
154 | 1 { |
2 startArr <- "[" byte: 0 | |
3 endArr <- "]" byte: 0 | |
4 startObj <- "{" byte: 0 | |
5 endObj <- "}" byte: 0 | |
6 quote <- "\"" byte: 0 | |
7 esc <- "\\" byte: 0 | |
8 zero <- "0" byte: 0 | |
9 nine <- "9" byte: 0 | |
10 neg <- "-" byte: 0 | |
11 space <- " " byte: 0 | |
12 comma <- "," byte: 0 | |
13 tab <- "\t" byte: 0 | |
14 colon <- ":" byte: 0 | |
165
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
15 t <- "t" byte: 0 |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
16 f <- "f" byte: 0 |
154 | 17 |
18 parseNumAt <- :str :at :recvResult { | |
19 num <- 0 | |
20 l <- str length | |
21 minus <- false | |
22 aft <- -1 | |
23 while: { at < l } do: { | |
24 b <- str byte: at | |
25 if: b = neg { | |
26 minus <- true | |
27 } else: { | |
28 if: b >= zero && b <= nine { | |
29 num <- num * 10 + (str byte: at) - zero | |
30 } else: { | |
31 aft <- at | |
32 at <- l | |
33 } | |
34 } | |
35 at <- at + 1 | |
36 } | |
37 if: aft < 0 { | |
38 aft <- at | |
39 } | |
40 if: minus { | |
41 num <- 0 - num | |
42 } | |
43 #{ | |
44 value <- num | |
45 after <- aft | |
46 } | |
47 } | |
48 | |
49 parseStrAt <- :src :at :recvResult { | |
50 //TODO: Deal with escaped characters | |
51 end <- src find: "\"" startingAt: at + 1 else: { src length } | |
52 #{ | |
53 value <- src from: (at + 1) withLength: (end - at - 1) | |
54 after <- end + 1 | |
55 } | |
56 } | |
57 | |
58 _decode:at <- :text :cur { | |
59 ret <- false | |
60 b <- text byte: cur | |
61 if: b = neg || b >= zero && b <= nine { | |
62 text parseNumAt: cur | |
63 } else: { | |
64 if: b = quote { | |
65 text parseStrAt: cur | |
66 } else: { | |
67 if: b = startArr { | |
68 len <- text length | |
69 val <- #[] | |
70 cur <- cur + 1 | |
71 aft <- -1 | |
72 while: { cur < len } do: { | |
73 b <- text byte: cur | |
74 if: b = endArr { | |
75 aft <- cur + 1 | |
76 cur <- len | |
77 } else: { | |
78 if: b = comma || b = space || b = tab { | |
79 cur <- cur + 1 | |
80 } else: { | |
81 el <- _decode: text at: cur | |
82 cur <- el after | |
83 val append: (el value) | |
84 } | |
85 } | |
86 } | |
87 #{ | |
88 value <- val | |
89 after <- aft | |
90 } | |
91 } else: { | |
92 if: b = startObj { | |
93 len <- text length | |
94 val <- dict linear | |
95 cur <- cur + 1 | |
96 aft <- -1 | |
97 expectKey <- true | |
98 key <- "" | |
99 while: { cur < len } do: { | |
100 b <- text byte: cur | |
101 if: b = comma || b = space || b = tab || b = colon { | |
102 cur <- cur + 1 | |
103 } else: { | |
104 if: expectKey { | |
105 if: b = endObj { | |
106 aft <- cur + 1 | |
107 cur <- len | |
108 } else: { | |
109 kd <- _decode: text at: cur | |
110 key <- kd value | |
111 cur <- kd after | |
112 expectKey <- false | |
113 } | |
114 } else: { | |
115 el <- _decode: text at: cur | |
116 val set: key (el value) | |
117 cur <- el after | |
118 expectKey <- true | |
119 } | |
120 } | |
121 } | |
122 #{ | |
123 after <- aft | |
124 value <- val | |
125 } | |
126 } else: { | |
165
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
127 if: b = t && (text from: cur withLength: 4) = "true" { |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
128 #{ |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
129 value <- true |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
130 after <- cur + 4 |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
131 } |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
132 } else: { |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
133 if: b = f && (text from: cur withLength: 5) = "false" { |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
134 #{ |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
135 value <- false |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
136 after <- cur + 5 |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
137 } |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
138 } else: { |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
139 #{ |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
140 value <- "foobar" |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
141 after <- (text length) |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
142 } |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
143 } |
154 | 144 } |
165
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
145 |
154 | 146 } |
147 } | |
148 } | |
149 } | |
150 } | |
151 #{ | |
152 decode <- :text { | |
153 (_decode: text at: 0) value | |
154 } | |
155 } | |
156 } |