lib: intro a simple json reader module using nitcc
authorAlexis Laferrière <alexis.laf@xymus.net>
Sun, 2 Feb 2014 05:04:53 +0000 (00:04 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Sun, 2 Feb 2014 22:52:23 +0000 (17:52 -0500)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/simple_json_reader/.gitignore [new file with mode: 0644]
lib/simple_json_reader/Makefile [new file with mode: 0644]
lib/simple_json_reader/json_lexer.nit [new file with mode: 0644]
lib/simple_json_reader/json_parser.nit [new file with mode: 0644]
lib/simple_json_reader/simple_json_reader.nit [new file with mode: 0644]
tests/sav/test_simple_json_reader.res [new file with mode: 0644]
tests/test_simple_json_reader.nit [new file with mode: 0644]

diff --git a/lib/simple_json_reader/.gitignore b/lib/simple_json_reader/.gitignore
new file mode 100644 (file)
index 0000000..0f08b2b
--- /dev/null
@@ -0,0 +1,7 @@
+json.concrete_grammar.txt
+json.dfa.dot
+json.gram.dot
+json.lr.dot
+json.lr.txt
+json.nfa.dot
+json_test_parser.nit
diff --git a/lib/simple_json_reader/Makefile b/lib/simple_json_reader/Makefile
new file mode 100644 (file)
index 0000000..8d10e1e
--- /dev/null
@@ -0,0 +1,2 @@
+compile-parser:
+       ../../contrib/nitcc/src/nitcc ../../contrib/nitcc/examples/json.sablecc
diff --git a/lib/simple_json_reader/json_lexer.nit b/lib/simple_json_reader/json_lexer.nit
new file mode 100644 (file)
index 0000000..6600f52
--- /dev/null
@@ -0,0 +1,408 @@
+# Lexer generated by nitcc for the grammar jsonimport nitcc_runtime
+import json_parser
+class Lexer_json
+       super Lexer
+       redef fun start_state do return dfastate_0
+end
+redef class Object
+       private fun dfastate_0: DFAState0 do return once new DFAState0
+       private fun dfastate_1: DFAState1 do return once new DFAState1
+       private fun dfastate_2: DFAState2 do return once new DFAState2
+       private fun dfastate_3: DFAState3 do return once new DFAState3
+       private fun dfastate_4: DFAState4 do return once new DFAState4
+       private fun dfastate_5: DFAState5 do return once new DFAState5
+       private fun dfastate_6: DFAState6 do return once new DFAState6
+       private fun dfastate_7: DFAState7 do return once new DFAState7
+       private fun dfastate_8: DFAState8 do return once new DFAState8
+       private fun dfastate_9: DFAState9 do return once new DFAState9
+       private fun dfastate_10: DFAState10 do return once new DFAState10
+       private fun dfastate_11: DFAState11 do return once new DFAState11
+       private fun dfastate_12: DFAState12 do return once new DFAState12
+       private fun dfastate_13: DFAState13 do return once new DFAState13
+       private fun dfastate_14: DFAState14 do return once new DFAState14
+       private fun dfastate_15: DFAState15 do return once new DFAState15
+       private fun dfastate_16: DFAState16 do return once new DFAState16
+       private fun dfastate_17: DFAState17 do return once new DFAState17
+       private fun dfastate_18: DFAState18 do return once new DFAState18
+       private fun dfastate_19: DFAState19 do return once new DFAState19
+       private fun dfastate_20: DFAState20 do return once new DFAState20
+       private fun dfastate_21: DFAState21 do return once new DFAState21
+       private fun dfastate_22: DFAState22 do return once new DFAState22
+       private fun dfastate_23: DFAState23 do return once new DFAState23
+       private fun dfastate_24: DFAState24 do return once new DFAState24
+       private fun dfastate_25: DFAState25 do return once new DFAState25
+       private fun dfastate_26: DFAState26 do return once new DFAState26
+       private fun dfastate_27: DFAState27 do return once new DFAState27
+       private fun dfastate_28: DFAState28 do return once new DFAState28
+       private fun dfastate_29: DFAState29 do return once new DFAState29
+       private fun dfastate_30: DFAState30 do return once new DFAState30
+       private fun dfastate_31: DFAState31 do return once new DFAState31
+end
+class MyNToken
+       super NToken
+end
+class DFAState0
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 8 then return null
+               if c <= 10 then return dfastate_1
+               if c <= 31 then return null
+               if c <= 32 then return dfastate_1
+               if c <= 33 then return null
+               if c <= 34 then return dfastate_2
+               if c <= 43 then return null
+               if c <= 44 then return dfastate_3
+               if c <= 45 then return dfastate_4
+               if c <= 47 then return null
+               if c <= 57 then return dfastate_5
+               if c <= 58 then return dfastate_6
+               if c <= 90 then return null
+               if c <= 91 then return dfastate_7
+               if c <= 92 then return null
+               if c <= 93 then return dfastate_8
+               if c <= 101 then return null
+               if c <= 102 then return dfastate_9
+               if c <= 109 then return null
+               if c <= 110 then return dfastate_10
+               if c <= 115 then return null
+               if c <= 116 then return dfastate_11
+               if c <= 122 then return null
+               if c <= 123 then return dfastate_12
+               if c <= 124 then return null
+               if c <= 125 then return dfastate_13
+               return null
+       end
+end
+class DFAState1
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               return null
+       end
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 8 then return null
+               if c <= 10 then return dfastate_1
+               if c <= 31 then return null
+               if c <= 32 then return dfastate_1
+               return null
+       end
+end
+class DFAState2
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 33 then return dfastate_29
+               if c <= 34 then return null
+               if c <= 91 then return dfastate_29
+               if c <= 92 then return dfastate_30
+               return dfastate_29
+       end
+end
+class DFAState3
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new N_39d_44d_39d
+               t.position = position
+               t.text = text
+               return t
+       end
+end
+class DFAState4
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 47 then return null
+               if c <= 57 then return dfastate_5
+               return null
+       end
+end
+class DFAState5
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new Nnumber
+               t.position = position
+               t.text = text
+               return t
+       end
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 45 then return null
+               if c <= 46 then return dfastate_24
+               if c <= 47 then return null
+               if c <= 57 then return dfastate_5
+               if c <= 68 then return null
+               if c <= 69 then return dfastate_25
+               if c <= 100 then return null
+               if c <= 101 then return dfastate_25
+               return null
+       end
+end
+class DFAState6
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new N_39d_58d_39d
+               t.position = position
+               t.text = text
+               return t
+       end
+end
+class DFAState7
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new N_39d_91d_39d
+               t.position = position
+               t.text = text
+               return t
+       end
+end
+class DFAState8
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new N_39d_93d_39d
+               t.position = position
+               t.text = text
+               return t
+       end
+end
+class DFAState9
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 96 then return null
+               if c <= 97 then return dfastate_20
+               return null
+       end
+end
+class DFAState10
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 116 then return null
+               if c <= 117 then return dfastate_17
+               return null
+       end
+end
+class DFAState11
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 113 then return null
+               if c <= 114 then return dfastate_14
+               return null
+       end
+end
+class DFAState12
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new N_39d_123d_39d
+               t.position = position
+               t.text = text
+               return t
+       end
+end
+class DFAState13
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new N_39d_125d_39d
+               t.position = position
+               t.text = text
+               return t
+       end
+end
+class DFAState14
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 116 then return null
+               if c <= 117 then return dfastate_15
+               return null
+       end
+end
+class DFAState15
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 100 then return null
+               if c <= 101 then return dfastate_16
+               return null
+       end
+end
+class DFAState16
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new N_39dtrue_39d
+               t.position = position
+               t.text = text
+               return t
+       end
+end
+class DFAState17
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 107 then return null
+               if c <= 108 then return dfastate_18
+               return null
+       end
+end
+class DFAState18
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 107 then return null
+               if c <= 108 then return dfastate_19
+               return null
+       end
+end
+class DFAState19
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new N_39dnull_39d
+               t.position = position
+               t.text = text
+               return t
+       end
+end
+class DFAState20
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 107 then return null
+               if c <= 108 then return dfastate_21
+               return null
+       end
+end
+class DFAState21
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 114 then return null
+               if c <= 115 then return dfastate_22
+               return null
+       end
+end
+class DFAState22
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 100 then return null
+               if c <= 101 then return dfastate_23
+               return null
+       end
+end
+class DFAState23
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new N_39dfalse_39d
+               t.position = position
+               t.text = text
+               return t
+       end
+end
+class DFAState24
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 47 then return null
+               if c <= 57 then return dfastate_28
+               return null
+       end
+end
+class DFAState25
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 42 then return null
+               if c <= 43 then return dfastate_26
+               if c <= 44 then return null
+               if c <= 45 then return dfastate_26
+               if c <= 47 then return null
+               if c <= 57 then return dfastate_27
+               return null
+       end
+end
+class DFAState26
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 47 then return null
+               if c <= 57 then return dfastate_27
+               return null
+       end
+end
+class DFAState27
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new Nnumber
+               t.position = position
+               t.text = text
+               return t
+       end
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 47 then return null
+               if c <= 57 then return dfastate_27
+               return null
+       end
+end
+class DFAState28
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new Nnumber
+               t.position = position
+               t.text = text
+               return t
+       end
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 47 then return null
+               if c <= 57 then return dfastate_28
+               if c <= 68 then return null
+               if c <= 69 then return dfastate_25
+               if c <= 100 then return null
+               if c <= 101 then return dfastate_25
+               return null
+       end
+end
+class DFAState29
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               if c <= 33 then return dfastate_29
+               if c <= 34 then return dfastate_31
+               if c <= 91 then return dfastate_29
+               if c <= 92 then return dfastate_30
+               return dfastate_29
+       end
+end
+class DFAState30
+       super DFAState
+       redef fun trans(char) do
+               var c = char.ascii
+               return dfastate_29
+       end
+end
+class DFAState31
+       super DFAState
+       redef fun is_accept do return true
+       redef fun make_token(position, text) do
+               var t = new Nstring
+               t.position = position
+               t.text = text
+               return t
+       end
+end
diff --git a/lib/simple_json_reader/json_parser.nit b/lib/simple_json_reader/json_parser.nit
new file mode 100644 (file)
index 0000000..f95a3cb
--- /dev/null
@@ -0,0 +1,832 @@
+# Parser generated by nitcc for the grammar json
+import nitcc_runtime
+class Parser_json
+       super Parser
+       redef fun start_state do return state_Start
+end
+redef class Object
+       private fun state_Start: LRStateStart do return once new LRStateStart
+       private fun state_value: LRStatevalue do return once new LRStatevalue
+       private fun state_number: LRStatenumber do return once new LRStatenumber
+       private fun state_string: LRStatestring do return once new LRStatestring
+       private fun state__39dtrue_39d: LRState_39dtrue_39d do return once new LRState_39dtrue_39d
+       private fun state__39dfalse_39d: LRState_39dfalse_39d do return once new LRState_39dfalse_39d
+       private fun state__39dnull_39d: LRState_39dnull_39d do return once new LRState_39dnull_39d
+       private fun state__39d_123d_39d: LRState_39d_123d_39d do return once new LRState_39d_123d_39d
+       private fun state__39d_91d_39d: LRState_39d_91d_39d do return once new LRState_39d_91d_39d
+       private fun state_value_32dEof: LRStatevalue_32dEof do return once new LRStatevalue_32dEof
+       private fun state__39d_123d_39d_32dmembers: LRState_39d_123d_39d_32dmembers do return once new LRState_39d_123d_39d_32dmembers
+       private fun state__39d_123d_39d_32d_39d_125d_39d: LRState_39d_123d_39d_32d_39d_125d_39d do return once new LRState_39d_123d_39d_32d_39d_125d_39d
+       private fun state__39d_123d_39d_32dpair: LRState_39d_123d_39d_32dpair do return once new LRState_39d_123d_39d_32dpair
+       private fun state__39d_123d_39d_32dstring: LRState_39d_123d_39d_32dstring do return once new LRState_39d_123d_39d_32dstring
+       private fun state__39d_91d_39d_32delements: LRState_39d_91d_39d_32delements do return once new LRState_39d_91d_39d_32delements
+       private fun state__39d_91d_39d_32d_39d_93d_39d: LRState_39d_91d_39d_32d_39d_93d_39d do return once new LRState_39d_91d_39d_32d_39d_93d_39d
+       private fun state__39d_91d_39d_32dvalue: LRState_39d_91d_39d_32dvalue do return once new LRState_39d_91d_39d_32dvalue
+       private fun state__39d_123d_39d_32dmembers_32d_39d_125d_39d: LRState_39d_123d_39d_32dmembers_32d_39d_125d_39d do return once new LRState_39d_123d_39d_32dmembers_32d_39d_125d_39d
+       private fun state__39d_123d_39d_32dmembers_32d_39d_44d_39d: LRState_39d_123d_39d_32dmembers_32d_39d_44d_39d do return once new LRState_39d_123d_39d_32dmembers_32d_39d_44d_39d
+       private fun state__39d_123d_39d_32dstring_32d_39d_58d_39d: LRState_39d_123d_39d_32dstring_32d_39d_58d_39d do return once new LRState_39d_123d_39d_32dstring_32d_39d_58d_39d
+       private fun state__39d_91d_39d_32delements_32d_39d_93d_39d: LRState_39d_91d_39d_32delements_32d_39d_93d_39d do return once new LRState_39d_91d_39d_32delements_32d_39d_93d_39d
+       private fun state__39d_91d_39d_32delements_32d_39d_44d_39d: LRState_39d_91d_39d_32delements_32d_39d_44d_39d do return once new LRState_39d_91d_39d_32delements_32d_39d_44d_39d
+       private fun state__39d_123d_39d_32dmembers_32d_39d_44d_39d_32dpair: LRState_39d_123d_39d_32dmembers_32d_39d_44d_39d_32dpair do return once new LRState_39d_123d_39d_32dmembers_32d_39d_44d_39d_32dpair
+       private fun state__39d_123d_39d_32dstring_32d_39d_58d_39d_32dvalue: LRState_39d_123d_39d_32dstring_32d_39d_58d_39d_32dvalue do return once new LRState_39d_123d_39d_32dstring_32d_39d_58d_39d_32dvalue
+       private fun state__39d_91d_39d_32delements_32d_39d_44d_39d_32dvalue: LRState_39d_91d_39d_32delements_32d_39d_44d_39d_32dvalue do return once new LRState_39d_91d_39d_32delements_32d_39d_44d_39d_32dvalue
+       private fun goto_Nvalue: Goto_Nvalue do return once new Goto_Nvalue
+       private fun goto_Nmembers: Goto_Nmembers do return once new Goto_Nmembers
+       private fun goto_Npair: Goto_Npair do return once new Goto_Npair
+       private fun goto_Nelements: Goto_Nelements do return once new Goto_Nelements
+       private fun goto_N_start: Goto_N_start do return once new Goto_N_start
+end
+redef class NToken
+       # guarded action for state Start
+       # 7 shift(s) and 0 reduce(s)
+       private fun action_sStart(parser: Parser) do
+               parser.parse_error
+       end
+       # guarded action for state value
+       # 1 shift(s) and 0 reduce(s)
+       private fun action_svalue(parser: Parser) do
+               parser.parse_error
+       end
+       # guarded action for state '{'
+       # 2 shift(s) and 0 reduce(s)
+       private fun action_s_39d_123d_39d(parser: Parser) do
+               parser.parse_error
+       end
+       # guarded action for state '['
+       # 8 shift(s) and 0 reduce(s)
+       private fun action_s_39d_91d_39d(parser: Parser) do
+               parser.parse_error
+       end
+       # guarded action for state '{' members
+       # 2 shift(s) and 0 reduce(s)
+       private fun action_s_39d_123d_39d_32dmembers(parser: Parser) do
+               parser.parse_error
+       end
+       # guarded action for state '{' string
+       # 1 shift(s) and 0 reduce(s)
+       private fun action_s_39d_123d_39d_32dstring(parser: Parser) do
+               parser.parse_error
+       end
+       # guarded action for state '[' elements
+       # 2 shift(s) and 0 reduce(s)
+       private fun action_s_39d_91d_39d_32delements(parser: Parser) do
+               parser.parse_error
+       end
+       # guarded action for state '{' members ','
+       # 1 shift(s) and 0 reduce(s)
+       private fun action_s_39d_123d_39d_32dmembers_32d_39d_44d_39d(parser: Parser) do
+               parser.parse_error
+       end
+       # guarded action for state '{' string ':'
+       # 7 shift(s) and 0 reduce(s)
+       private fun action_s_39d_123d_39d_32dstring_32d_39d_58d_39d(parser: Parser) do
+               parser.parse_error
+       end
+       # guarded action for state '[' elements ','
+       # 7 shift(s) and 0 reduce(s)
+       private fun action_s_39d_91d_39d_32delements_32d_39d_44d_39d(parser: Parser) do
+               parser.parse_error
+       end
+end
+class N_39d_123d_39d
+       super NToken
+       redef fun action_sStart(parser) do
+               parser.shift(state__39d_123d_39d)
+       end
+       redef fun action_s_39d_91d_39d(parser) do
+               parser.shift(state__39d_123d_39d)
+       end
+       redef fun action_s_39d_123d_39d_32dstring_32d_39d_58d_39d(parser) do
+               parser.shift(state__39d_123d_39d)
+       end
+       redef fun action_s_39d_91d_39d_32delements_32d_39d_44d_39d(parser) do
+               parser.shift(state__39d_123d_39d)
+       end
+       redef fun node_name do return "\'\{\'"
+end
+class N_39d_125d_39d
+       super NToken
+       redef fun action_s_39d_123d_39d(parser) do
+               parser.shift(state__39d_123d_39d_32d_39d_125d_39d)
+       end
+       redef fun action_s_39d_123d_39d_32dmembers(parser) do
+               parser.shift(state__39d_123d_39d_32dmembers_32d_39d_125d_39d)
+       end
+       redef fun node_name do return "\'\}\'"
+end
+class N_39d_91d_39d
+       super NToken
+       redef fun action_sStart(parser) do
+               parser.shift(state__39d_91d_39d)
+       end
+       redef fun action_s_39d_91d_39d(parser) do
+               parser.shift(state__39d_91d_39d)
+       end
+       redef fun action_s_39d_123d_39d_32dstring_32d_39d_58d_39d(parser) do
+               parser.shift(state__39d_91d_39d)
+       end
+       redef fun action_s_39d_91d_39d_32delements_32d_39d_44d_39d(parser) do
+               parser.shift(state__39d_91d_39d)
+       end
+       redef fun node_name do return "\'[\'"
+end
+class N_39d_93d_39d
+       super NToken
+       redef fun action_s_39d_91d_39d(parser) do
+               parser.shift(state__39d_91d_39d_32d_39d_93d_39d)
+       end
+       redef fun action_s_39d_91d_39d_32delements(parser) do
+               parser.shift(state__39d_91d_39d_32delements_32d_39d_93d_39d)
+       end
+       redef fun node_name do return "\']\'"
+end
+class Nnumber
+       super NToken
+       redef fun action_sStart(parser) do
+               parser.shift(state_number)
+       end
+       redef fun action_s_39d_91d_39d(parser) do
+               parser.shift(state_number)
+       end
+       redef fun action_s_39d_123d_39d_32dstring_32d_39d_58d_39d(parser) do
+               parser.shift(state_number)
+       end
+       redef fun action_s_39d_91d_39d_32delements_32d_39d_44d_39d(parser) do
+               parser.shift(state_number)
+       end
+       redef fun node_name do return "number"
+end
+class Nstring
+       super NToken
+       redef fun action_sStart(parser) do
+               parser.shift(state_string)
+       end
+       redef fun action_s_39d_123d_39d(parser) do
+               parser.shift(state__39d_123d_39d_32dstring)
+       end
+       redef fun action_s_39d_91d_39d(parser) do
+               parser.shift(state_string)
+       end
+       redef fun action_s_39d_123d_39d_32dmembers_32d_39d_44d_39d(parser) do
+               parser.shift(state__39d_123d_39d_32dstring)
+       end
+       redef fun action_s_39d_123d_39d_32dstring_32d_39d_58d_39d(parser) do
+               parser.shift(state_string)
+       end
+       redef fun action_s_39d_91d_39d_32delements_32d_39d_44d_39d(parser) do
+               parser.shift(state_string)
+       end
+       redef fun node_name do return "string"
+end
+class N_39dtrue_39d
+       super NToken
+       redef fun action_sStart(parser) do
+               parser.shift(state__39dtrue_39d)
+       end
+       redef fun action_s_39d_91d_39d(parser) do
+               parser.shift(state__39dtrue_39d)
+       end
+       redef fun action_s_39d_123d_39d_32dstring_32d_39d_58d_39d(parser) do
+               parser.shift(state__39dtrue_39d)
+       end
+       redef fun action_s_39d_91d_39d_32delements_32d_39d_44d_39d(parser) do
+               parser.shift(state__39dtrue_39d)
+       end
+       redef fun node_name do return "\'true\'"
+end
+class N_39dfalse_39d
+       super NToken
+       redef fun action_sStart(parser) do
+               parser.shift(state__39dfalse_39d)
+       end
+       redef fun action_s_39d_91d_39d(parser) do
+               parser.shift(state__39dfalse_39d)
+       end
+       redef fun action_s_39d_123d_39d_32dstring_32d_39d_58d_39d(parser) do
+               parser.shift(state__39dfalse_39d)
+       end
+       redef fun action_s_39d_91d_39d_32delements_32d_39d_44d_39d(parser) do
+               parser.shift(state__39dfalse_39d)
+       end
+       redef fun node_name do return "\'false\'"
+end
+class N_39dnull_39d
+       super NToken
+       redef fun action_sStart(parser) do
+               parser.shift(state__39dnull_39d)
+       end
+       redef fun action_s_39d_91d_39d(parser) do
+               parser.shift(state__39dnull_39d)
+       end
+       redef fun action_s_39d_123d_39d_32dstring_32d_39d_58d_39d(parser) do
+               parser.shift(state__39dnull_39d)
+       end
+       redef fun action_s_39d_91d_39d_32delements_32d_39d_44d_39d(parser) do
+               parser.shift(state__39dnull_39d)
+       end
+       redef fun node_name do return "\'null\'"
+end
+class N_39d_44d_39d
+       super NToken
+       redef fun action_s_39d_123d_39d_32dmembers(parser) do
+               parser.shift(state__39d_123d_39d_32dmembers_32d_39d_44d_39d)
+       end
+       redef fun action_s_39d_91d_39d_32delements(parser) do
+               parser.shift(state__39d_91d_39d_32delements_32d_39d_44d_39d)
+       end
+       redef fun node_name do return "\',\'"
+end
+class N_39d_58d_39d
+       super NToken
+       redef fun action_s_39d_123d_39d_32dstring(parser) do
+               parser.shift(state__39d_123d_39d_32dstring_32d_39d_58d_39d)
+       end
+       redef fun node_name do return "\':\'"
+end
+redef class NEof
+       super NToken
+       redef fun action_svalue(parser) do
+               parser.shift(state_value_32dEof)
+       end
+       redef fun node_name do return "Eof"
+end
+redef class LRGoto
+       private fun goto_s_39d_123d_39d(parser: Parser) do abort
+       private fun goto_s_39d_91d_39d(parser: Parser) do abort
+end
+class Goto_Nvalue
+       super LRGoto
+       redef fun goto_s_39d_91d_39d(parser) do
+               parser.push(state__39d_91d_39d_32dvalue)
+       end
+end
+class Goto_Nmembers
+       super LRGoto
+       redef fun goto_s_39d_123d_39d(parser) do
+               parser.push(state__39d_123d_39d_32dmembers)
+       end
+end
+class Goto_Npair
+       super LRGoto
+       redef fun goto_s_39d_123d_39d(parser) do
+               parser.push(state__39d_123d_39d_32dpair)
+       end
+end
+class Goto_Nelements
+       super LRGoto
+       redef fun goto_s_39d_91d_39d(parser) do
+               parser.push(state__39d_91d_39d_32delements)
+       end
+end
+class Goto_N_start
+       super LRGoto
+end
+class Nvalue
+       super NProd
+       redef fun node_name do return "value"
+end
+class Nvalue_number
+       super Nvalue
+       redef fun node_name do return "value_number"
+       var n_number: Nnumber
+       init(n_number: Nnumber) do
+               self.n_number = n_number
+       end
+       redef fun number_of_children do return 1
+       redef fun child(i) do
+               if i == 0 then return n_number
+               abort
+       end
+end
+class Nvalue_string
+       super Nvalue
+       redef fun node_name do return "value_string"
+       var n_string: Nstring
+       init(n_string: Nstring) do
+               self.n_string = n_string
+       end
+       redef fun number_of_children do return 1
+       redef fun child(i) do
+               if i == 0 then return n_string
+               abort
+       end
+end
+class Nvalue_true
+       super Nvalue
+       redef fun node_name do return "value_true"
+       var n_0: N_39dtrue_39d
+       init(n_0: N_39dtrue_39d) do
+               self.n_0 = n_0
+       end
+       redef fun number_of_children do return 1
+       redef fun child(i) do
+               if i == 0 then return n_0
+               abort
+       end
+end
+class Nvalue_false
+       super Nvalue
+       redef fun node_name do return "value_false"
+       var n_0: N_39dfalse_39d
+       init(n_0: N_39dfalse_39d) do
+               self.n_0 = n_0
+       end
+       redef fun number_of_children do return 1
+       redef fun child(i) do
+               if i == 0 then return n_0
+               abort
+       end
+end
+class Nvalue_null
+       super Nvalue
+       redef fun node_name do return "value_null"
+       var n_0: N_39dnull_39d
+       init(n_0: N_39dnull_39d) do
+               self.n_0 = n_0
+       end
+       redef fun number_of_children do return 1
+       redef fun child(i) do
+               if i == 0 then return n_0
+               abort
+       end
+end
+class Nvalue_object
+       super Nvalue
+       redef fun node_name do return "value_object"
+       var n_0: N_39d_123d_39d
+       var n_members: nullable Nmembers
+       var n_2: N_39d_125d_39d
+       init(n_0: N_39d_123d_39d, n_members: nullable Nmembers, n_2: N_39d_125d_39d) do
+               self.n_0 = n_0
+               self.n_members = n_members
+               self.n_2 = n_2
+       end
+       redef fun number_of_children do return 3
+       redef fun child(i) do
+               if i == 0 then return n_0
+               if i == 1 then return n_members
+               if i == 2 then return n_2
+               abort
+       end
+end
+class Nvalue_array
+       super Nvalue
+       redef fun node_name do return "value_array"
+       var n_0: N_39d_91d_39d
+       var n_elements: nullable Nelements
+       var n_2: N_39d_93d_39d
+       init(n_0: N_39d_91d_39d, n_elements: nullable Nelements, n_2: N_39d_93d_39d) do
+               self.n_0 = n_0
+               self.n_elements = n_elements
+               self.n_2 = n_2
+       end
+       redef fun number_of_children do return 3
+       redef fun child(i) do
+               if i == 0 then return n_0
+               if i == 1 then return n_elements
+               if i == 2 then return n_2
+               abort
+       end
+end
+class Nmembers
+       super NProd
+       redef fun node_name do return "members"
+end
+class Nmembers_tail
+       super Nmembers
+       redef fun node_name do return "members_tail"
+       var n_members: Nmembers
+       var n_1: N_39d_44d_39d
+       var n_pair: Npair
+       init(n_members: Nmembers, n_1: N_39d_44d_39d, n_pair: Npair) do
+               self.n_members = n_members
+               self.n_1 = n_1
+               self.n_pair = n_pair
+       end
+       redef fun number_of_children do return 3
+       redef fun child(i) do
+               if i == 0 then return n_members
+               if i == 1 then return n_1
+               if i == 2 then return n_pair
+               abort
+       end
+end
+class Nmembers_head
+       super Nmembers
+       redef fun node_name do return "members_head"
+       var n_pair: Npair
+       init(n_pair: Npair) do
+               self.n_pair = n_pair
+       end
+       redef fun number_of_children do return 1
+       redef fun child(i) do
+               if i == 0 then return n_pair
+               abort
+       end
+end
+class Npair
+       super NProd
+       redef fun node_name do return "pair"
+       var n_string: Nstring
+       var n_1: N_39d_58d_39d
+       var n_value: Nvalue
+       init(n_string: Nstring, n_1: N_39d_58d_39d, n_value: Nvalue) do
+               self.n_string = n_string
+               self.n_1 = n_1
+               self.n_value = n_value
+       end
+       redef fun number_of_children do return 3
+       redef fun child(i) do
+               if i == 0 then return n_string
+               if i == 1 then return n_1
+               if i == 2 then return n_value
+               abort
+       end
+end
+class Nelements
+       super NProd
+       redef fun node_name do return "elements"
+end
+class Nelements_tail
+       super Nelements
+       redef fun node_name do return "elements_tail"
+       var n_elements: Nelements
+       var n_1: N_39d_44d_39d
+       var n_value: Nvalue
+       init(n_elements: Nelements, n_1: N_39d_44d_39d, n_value: Nvalue) do
+               self.n_elements = n_elements
+               self.n_1 = n_1
+               self.n_value = n_value
+       end
+       redef fun number_of_children do return 3
+       redef fun child(i) do
+               if i == 0 then return n_elements
+               if i == 1 then return n_1
+               if i == 2 then return n_value
+               abort
+       end
+end
+class Nelements_head
+       super Nelements
+       redef fun node_name do return "elements_head"
+       var n_value: Nvalue
+       init(n_value: Nvalue) do
+               self.n_value = n_value
+       end
+       redef fun number_of_children do return 1
+       redef fun child(i) do
+               if i == 0 then return n_value
+               abort
+       end
+end
+class N_start
+       super NProd
+       redef fun node_name do return "_start"
+end
+class NStart
+       super N_start
+       redef fun node_name do return "Start"
+       var n_0: Nvalue
+       var n_1: NEof
+       init(n_0: Nvalue, n_1: NEof) do
+               self.n_0 = n_0
+               self.n_1 = n_1
+       end
+       redef fun number_of_children do return 2
+       redef fun child(i) do
+               if i == 0 then return n_0
+               if i == 1 then return n_1
+               abort
+       end
+end
+# State Start
+private class LRStateStart
+       super LRState
+       redef fun to_s do return "Start"
+       redef fun error_msg do return "value"
+       redef fun action(parser) do
+               parser.peek_token.action_sStart(parser)
+       end
+       redef fun goto(parser, goto) do
+               parser.push(state_value)
+       end
+end
+# State value
+private class LRStatevalue
+       super LRState
+       redef fun to_s do return "value"
+       redef fun error_msg do return "Eof"
+       redef fun action(parser) do
+               parser.peek_token.action_svalue(parser)
+       end
+end
+# State number
+private class LRStatenumber
+       super LRState
+       redef fun to_s do return "number"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE value::value_number=number
+               var n0 = parser.pop.as(Nnumber)
+               var p1 = new Nvalue_number(n0)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nvalue)
+       end
+end
+# State string
+private class LRStatestring
+       super LRState
+       redef fun to_s do return "string"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE value::value_string=string
+               var n0 = parser.pop.as(Nstring)
+               var p1 = new Nvalue_string(n0)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nvalue)
+       end
+end
+# State 'true'
+private class LRState_39dtrue_39d
+       super LRState
+       redef fun to_s do return "\'true\'"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE value::value_true='true'
+               var n0 = parser.pop.as(N_39dtrue_39d)
+               var p1 = new Nvalue_true(n0)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nvalue)
+       end
+end
+# State 'false'
+private class LRState_39dfalse_39d
+       super LRState
+       redef fun to_s do return "\'false\'"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE value::value_false='false'
+               var n0 = parser.pop.as(N_39dfalse_39d)
+               var p1 = new Nvalue_false(n0)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nvalue)
+       end
+end
+# State 'null'
+private class LRState_39dnull_39d
+       super LRState
+       redef fun to_s do return "\'null\'"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE value::value_null='null'
+               var n0 = parser.pop.as(N_39dnull_39d)
+               var p1 = new Nvalue_null(n0)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nvalue)
+       end
+end
+# State '{'
+private class LRState_39d_123d_39d
+       super LRState
+       redef fun to_s do return "\'\{\'"
+       redef fun error_msg do return "members, pair"
+       redef fun action(parser) do
+               parser.peek_token.action_s_39d_123d_39d(parser)
+       end
+       redef fun goto(parser, goto) do
+               goto.goto_s_39d_123d_39d(parser)
+       end
+end
+# State '['
+private class LRState_39d_91d_39d
+       super LRState
+       redef fun to_s do return "\'[\'"
+       redef fun error_msg do return "elements, value"
+       redef fun action(parser) do
+               parser.peek_token.action_s_39d_91d_39d(parser)
+       end
+       redef fun goto(parser, goto) do
+               goto.goto_s_39d_91d_39d(parser)
+       end
+end
+# State value Eof
+private class LRStatevalue_32dEof
+       super LRState
+       redef fun to_s do return "value Eof"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE _start::Start=value Eof
+               var n1 = parser.pop.as(NEof)
+               var n0 = parser.pop.as(Nvalue)
+               var p1 = new NStart(n0, n1)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.stop = true
+       end
+end
+# State '{' members
+private class LRState_39d_123d_39d_32dmembers
+       super LRState
+       redef fun to_s do return "\'\{\' members"
+       redef fun error_msg do return "\'\}\', \',\'"
+       redef fun action(parser) do
+               parser.peek_token.action_s_39d_123d_39d_32dmembers(parser)
+       end
+end
+# State '{' '}'
+private class LRState_39d_123d_39d_32d_39d_125d_39d
+       super LRState
+       redef fun to_s do return "\'\{\' \'\}\'"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE value::value_object_1='{' '}'
+               var n1 = parser.pop.as(N_39d_125d_39d)
+               var n0 = parser.pop.as(N_39d_123d_39d)
+               var p1 = new Nvalue_object(n0, null, n1)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nvalue)
+       end
+end
+# State '{' pair
+private class LRState_39d_123d_39d_32dpair
+       super LRState
+       redef fun to_s do return "\'\{\' pair"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE members::members_head=pair
+               var n0 = parser.pop.as(Npair)
+               var p1 = new Nmembers_head(n0)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nmembers)
+       end
+end
+# State '{' string
+private class LRState_39d_123d_39d_32dstring
+       super LRState
+       redef fun to_s do return "\'\{\' string"
+       redef fun error_msg do return "\':\'"
+       redef fun action(parser) do
+               parser.peek_token.action_s_39d_123d_39d_32dstring(parser)
+       end
+end
+# State '[' elements
+private class LRState_39d_91d_39d_32delements
+       super LRState
+       redef fun to_s do return "\'[\' elements"
+       redef fun error_msg do return "\']\', \',\'"
+       redef fun action(parser) do
+               parser.peek_token.action_s_39d_91d_39d_32delements(parser)
+       end
+end
+# State '[' ']'
+private class LRState_39d_91d_39d_32d_39d_93d_39d
+       super LRState
+       redef fun to_s do return "\'[\' \']\'"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE value::value_array_1='[' ']'
+               var n1 = parser.pop.as(N_39d_93d_39d)
+               var n0 = parser.pop.as(N_39d_91d_39d)
+               var p1 = new Nvalue_array(n0, null, n1)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nvalue)
+       end
+end
+# State '[' value
+private class LRState_39d_91d_39d_32dvalue
+       super LRState
+       redef fun to_s do return "\'[\' value"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE elements::elements_head=value
+               var n0 = parser.pop.as(Nvalue)
+               var p1 = new Nelements_head(n0)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nelements)
+       end
+end
+# State '{' members '}'
+private class LRState_39d_123d_39d_32dmembers_32d_39d_125d_39d
+       super LRState
+       redef fun to_s do return "\'\{\' members \'\}\'"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE value::value_object_0='{' members '}'
+               var n2 = parser.pop.as(N_39d_125d_39d)
+               var n1 = parser.pop.as(Nmembers)
+               var n0 = parser.pop.as(N_39d_123d_39d)
+               var p1 = new Nvalue_object(n0, n1, n2)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nvalue)
+       end
+end
+# State '{' members ','
+private class LRState_39d_123d_39d_32dmembers_32d_39d_44d_39d
+       super LRState
+       redef fun to_s do return "\'\{\' members \',\'"
+       redef fun error_msg do return "pair"
+       redef fun action(parser) do
+               parser.peek_token.action_s_39d_123d_39d_32dmembers_32d_39d_44d_39d(parser)
+       end
+       redef fun goto(parser, goto) do
+               parser.push(state__39d_123d_39d_32dmembers_32d_39d_44d_39d_32dpair)
+       end
+end
+# State '{' string ':'
+private class LRState_39d_123d_39d_32dstring_32d_39d_58d_39d
+       super LRState
+       redef fun to_s do return "\'\{\' string \':\'"
+       redef fun error_msg do return "value"
+       redef fun action(parser) do
+               parser.peek_token.action_s_39d_123d_39d_32dstring_32d_39d_58d_39d(parser)
+       end
+       redef fun goto(parser, goto) do
+               parser.push(state__39d_123d_39d_32dstring_32d_39d_58d_39d_32dvalue)
+       end
+end
+# State '[' elements ']'
+private class LRState_39d_91d_39d_32delements_32d_39d_93d_39d
+       super LRState
+       redef fun to_s do return "\'[\' elements \']\'"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE value::value_array_0='[' elements ']'
+               var n2 = parser.pop.as(N_39d_93d_39d)
+               var n1 = parser.pop.as(Nelements)
+               var n0 = parser.pop.as(N_39d_91d_39d)
+               var p1 = new Nvalue_array(n0, n1, n2)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nvalue)
+       end
+end
+# State '[' elements ','
+private class LRState_39d_91d_39d_32delements_32d_39d_44d_39d
+       super LRState
+       redef fun to_s do return "\'[\' elements \',\'"
+       redef fun error_msg do return "value"
+       redef fun action(parser) do
+               parser.peek_token.action_s_39d_91d_39d_32delements_32d_39d_44d_39d(parser)
+       end
+       redef fun goto(parser, goto) do
+               parser.push(state__39d_91d_39d_32delements_32d_39d_44d_39d_32dvalue)
+       end
+end
+# State '{' members ',' pair
+private class LRState_39d_123d_39d_32dmembers_32d_39d_44d_39d_32dpair
+       super LRState
+       redef fun to_s do return "\'\{\' members \',\' pair"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE members::members_tail=members ',' pair
+               var n2 = parser.pop.as(Npair)
+               var n1 = parser.pop.as(N_39d_44d_39d)
+               var n0 = parser.pop.as(Nmembers)
+               var p1 = new Nmembers_tail(n0, n1, n2)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nmembers)
+       end
+end
+# State '{' string ':' value
+private class LRState_39d_123d_39d_32dstring_32d_39d_58d_39d_32dvalue
+       super LRState
+       redef fun to_s do return "\'\{\' string \':\' value"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE pair::pair=string ':' value
+               var n2 = parser.pop.as(Nvalue)
+               var n1 = parser.pop.as(N_39d_58d_39d)
+               var n0 = parser.pop.as(Nstring)
+               var p1 = new Npair(n0, n1, n2)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Npair)
+       end
+end
+# State '[' elements ',' value
+private class LRState_39d_91d_39d_32delements_32d_39d_44d_39d_32dvalue
+       super LRState
+       redef fun to_s do return "\'[\' elements \',\' value"
+       redef fun error_msg do return ""
+       redef fun action(parser) do
+               # REDUCE elements::elements_tail=elements ',' value
+               var n2 = parser.pop.as(Nvalue)
+               var n1 = parser.pop.as(N_39d_44d_39d)
+               var n0 = parser.pop.as(Nelements)
+               var p1 = new Nelements_tail(n0, n1, n2)
+               var prod = p1
+               parser.node_stack.push prod
+               parser.goto(goto_Nelements)
+       end
+end
diff --git a/lib/simple_json_reader/simple_json_reader.nit b/lib/simple_json_reader/simple_json_reader.nit
new file mode 100644 (file)
index 0000000..f03bf91
--- /dev/null
@@ -0,0 +1,131 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module simple_json_reader
+
+import json_parser
+import json_lexer
+
+redef class Nvalue
+       fun to_nit_object: nullable Object is abstract
+end
+
+redef class Nvalue_number
+       redef fun to_nit_object
+       do
+               var text = n_number.text
+               if text.has('.') or text.has('e') or text.has('E') then return text.to_f
+               return text.to_i
+       end
+end
+
+redef class Nvalue_string
+       redef fun to_nit_object do return n_string.to_nit_string
+end
+
+redef class Nvalue_true
+       redef fun to_nit_object do return true
+end
+
+redef class Nvalue_false
+       redef fun to_nit_object do return false
+end
+
+redef class Nvalue_null
+       redef fun to_nit_object do return null
+end
+
+redef class Nstring
+       # FIXME support \n, etc.
+       fun to_nit_string: String do return text.substring(1, text.length-2)
+end
+
+redef class Nvalue_object
+       redef fun to_nit_object
+       do
+               var obj = new HashMap[String, nullable Object]
+               var members = n_members
+               if members != null then
+                       var pairs = members.pairs
+                       for pair in pairs do obj[pair.name] = pair.value
+               end
+               return obj
+       end
+end
+
+redef class Nmembers
+       fun pairs: Array[Npair] is abstract
+end
+
+redef class Nmembers_tail
+       redef fun pairs
+       do
+               var arr = n_members.pairs
+               arr.add n_pair
+               return arr
+       end
+end
+
+redef class Nmembers_head
+       redef fun pairs do return [n_pair]
+end
+
+redef class Npair
+       fun name: String do return n_string.to_nit_string
+       fun value: nullable Object do return n_value.to_nit_object
+end
+
+redef class Nvalue_array
+       redef fun to_nit_object
+       do
+               var arr = new Array[nullable Object]
+               var elements = n_elements
+               if elements != null then
+                       var items = elements.items
+                       for item in items do arr.add(item.to_nit_object)
+               end
+               return arr
+       end
+end
+
+redef class Nelements
+       fun items: Array[Nvalue] is abstract
+end
+
+redef class Nelements_tail
+       redef fun items
+       do
+               var items = n_elements.items
+               items.add(n_value)
+               return items
+       end
+end
+
+redef class Nelements_head
+       redef fun items do return [n_value]
+end
+
+redef class String
+       fun json_to_nit_object: nullable Object
+       do
+               var lexer = new Lexer_json(self)
+               var parser = new Parser_json
+               var tokens = lexer.lex
+               parser.tokens.add_all(tokens)
+               var root_node = parser.parse.as(NStart)
+               return root_node.n_0.to_nit_object
+       end
+end
diff --git a/tests/sav/test_simple_json_reader.res b/tests/sav/test_simple_json_reader.res
new file mode 100644 (file)
index 0000000..0a122d4
--- /dev/null
@@ -0,0 +1,4 @@
+# Json: {"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": "a", "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null]}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": "b", "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "qwer"}, "aa": {"__kind": "ref", "__id": 1}}
+# Nit: <HashMap __kind: obj, __id: 0, __class: C, a: <HashMap __kind: obj, __id: 1, __class: A, b: true, c: a, f: 0.123, i: 1234, s: asdf, n: <null>, array: 88hello>, b: <HashMap __kind: obj, __id: 2, __class: B, b: false, c: b, f: 123.123, i: 2345, s: hjkl, n: <null>, array: 88hello, ii: 1111, ss: qwer>, aa: <HashMap __kind: ref, __id: 1>>
+# Json: {"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": "a", "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null]}
+# Nit: <HashMap __kind: obj, __id: 0, __class: A, b: true, c: a, f: 0.123, i: 1234, s: asdf, n: <null>, array: 88hello>
diff --git a/tests/test_simple_json_reader.nit b/tests/test_simple_json_reader.nit
new file mode 100644 (file)
index 0000000..f38cbaa
--- /dev/null
@@ -0,0 +1,14 @@
+import simple_json_reader
+
+redef class HashMap[K,V]
+       redef fun to_s do return "<HashMap {join(", ", ": ")}>"
+end
+
+var a = "\{\"__kind\": \"obj\", \"__id\": 0, \"__class\": \"C\", \"a\": \{\"__kind\": \"obj\", \"__id\": 1, \"__class\": \"A\", \"b\": true, \"c\": \"a\", \"f\": 0.123, \"i\": 1234, \"s\": \"asdf\", \"n\": null, \"array\": [88, \"hello\", null]\}, \"b\": \{\"__kind\": \"obj\", \"__id\": 2, \"__class\": \"B\", \"b\": false, \"c\": \"b\", \"f\": 123.123, \"i\": 2345, \"s\": \"hjkl\", \"n\": null, \"array\": [88, \"hello\", null], \"ii\": 1111, \"ss\": \"qwer\"\}, \"aa\": \{\"__kind\": \"ref\", \"__id\": 1\}\}"
+var b = "\{\"__kind\": \"obj\", \"__id\": 0, \"__class\": \"A\", \"b\": true, \"c\": \"a\", \"f\": 0.123, \"i\": 1234, \"s\": \"asdf\", \"n\": null, \"array\": [88, \"hello\", null]\}"
+
+for s in [a, b] do
+       var obj = s.json_to_nit_object
+       print "# Json: {s}"
+       print "# Nit: {obj or else "<null>"}"
+end