@@ -17,6 +17,7 @@ module Json.Decode
19import Prelude hiding (length)
19import Prelude hiding (length)
20+import qualified Data.ByteString.Char8 as Char8
20import qualified Data.ByteString.Internal as B
21import qualified Data.ByteString.Internal as B
21import qualified Data.HashMap.Strict as HashMap
22import qualified Data.HashMap.Strict as HashMap
22import qualified Data.Text as Text
23import qualified Data.Text as Text
@@ -30,6 +31,7 @@ import qualified Parse.Primitives as P
30import qualified Parse.Primitives.Internals as I
31import qualified Parse.Primitives.Internals as I
31import Parse.Primitives.Internals (Parser(..), State(..), noError)
32import Parse.Primitives.Internals (Parser(..), State(..), noError)
32import qualified Parse.Primitives.Keyword as Keyword
33import qualified Parse.Primitives.Keyword as Keyword
34+import qualified Parse.Primitives.Number as Number
33import qualified Parse.Primitives.Symbol as Symbol
35import qualified Parse.Primitives.Symbol as Symbol
34import qualified Reporting.Error.Syntax as E
36import qualified Reporting.Error.Syntax as E
35import qualified Reporting.Region as R
37import qualified Reporting.Region as R
@@ -169,7 +171,41 @@ arrayHelp !length revEntries =
170number :: Parser Json.Value
172number :: Parser Json.Value
172− error "TODO"
174+ Parser $ \(State fp offset terminal indent row col ctx) cok cerr _ eerr ->
175+ if offset < terminal then
178+ !word = I.unsafeIndex fp offset
179+ !offset1 = offset + 1
181+ if word <= 0x39 {- 9 -} && word >= 0x31 {- 1 -} then
182+ case Number.chompInt fp offset1 terminal (fromIntegral (word - 0x30 {- 0 -})) of
183+ Number.Err newOffset problem ->
184+ cerr (E.ParseError row (col + (newOffset - offset)) problem)
186+ Number.OkInt newOffset n ->
188+ !newState = State fp newOffset terminal indent row (col + (newOffset - offset)) ctx
190+ cok (Json.Integer n) newState noError
192+ Number.OkFloat newOffset ->
194+ !length = newOffset - offset
195+ !scientific = read $ Char8.unpack $ B.PS fp offset length
196+ !newState = State fp newOffset terminal indent row (col + length) ctx
198+ cok (Json.Float scientific) newState noError
200+ else if word == 0x30 {- 0 -} then
201+ cok (Json.Integer 0) (State fp offset1 terminal indent row (col + 1) ctx) noError