diff --git a/json/scanner/json_parser.e b/json/scanner/json_parser.e index d6dc313d..80e0177e 100644 --- a/json/scanner/json_parser.e +++ b/json/scanner/json_parser.e @@ -13,47 +13,59 @@ class create make_parser feature -- Access + is_parsed:BOOLEAN + + current_errors:STRING make_parser(a_json:STRING) is -- do make(a_json) + is_parsed:=true end + parse_json:JSON_VALUE is + -- + do + Result:=parse + if extra_elements then + is_parsed:=false + end + end + parse:JSON_VALUE is -- local c:CHARACTER do - skip_withe_spaces - c:=actual - if c.is_equal (j_object_open) then - Result:=parse_object - elseif c.is_equal (j_string) then - Result:=parse_string - elseif c.is_equal (j_array_open) then - Result:=parse_array - elseif c.is_digit or c.is_equal (j_minus) or - c.is_equal (j_plus) or c.is_equal (j_dot) then - Result:=parse_number - elseif is_null then - -- - Result:=create {JSON_NULL} - next;next;next; - elseif is_true then - Result:=create {JSON_BOOLEAN}.make_boolean (true) - next;next;next; - elseif is_false then - Result:=create {JSON_BOOLEAN}.make_boolean (false) - next;next;next;next; - else - - Result:=void + if is_parsed then + skip_withe_spaces + c:=actual + if c.is_equal (j_object_open) then + Result:=parse_object + elseif c.is_equal (j_string) then + Result:=parse_string + elseif c.is_equal (j_array_open) then + Result:=parse_array + elseif c.is_digit or c.is_equal (j_minus) or + c.is_equal (j_plus) or c.is_equal (j_dot) then + Result:=parse_number + elseif is_null then + -- + Result:=create {JSON_NULL} + next;next;next; + elseif is_true then + Result:=create {JSON_BOOLEAN}.make_boolean (true) + next;next;next; + elseif is_false then + Result:=create {JSON_BOOLEAN}.make_boolean (false) + next;next;next;next; + else + is_parsed:=false + Result:=void + end end - rescue - handle_syntax_exception - retry - end + end parse_object:JSON_OBJECT is -- object @@ -85,21 +97,28 @@ feature -- Access next skip_withe_spaces else - excpetions.raise("%N Input string is a not well formed JSON, expected: %":%", found:" +actual.out +"%N") + is_parsed:=false + --excpetions.raise("%N Input string is a not well formed JSON, expected: %":%", found:" +actual.out +"%N") has_more:=false end l_value:=parse - Result.put (l_json_string, l_value) - next - skip_withe_spaces - if actual.is_equal (j_object_close) then - has_more:=false - elseif not actual.is_equal (',') then - has_more:=false - excpetions.raise("JSON Object sintactically malformed expected :%"'%" ") - end - end + if is_parsed then + Result.put (l_value,l_json_string) + next + skip_withe_spaces + if actual.is_equal (j_object_close) then + has_more:=false + elseif not actual.is_equal (',') then + has_more:=false + is_parsed:=false + --excpetions.raise("JSON Object sintactically malformed expected :%"'%" ") + end + else + has_more:=false + -- explain the error + end + end end end @@ -121,7 +140,21 @@ feature -- Access has_more:=false elseif close_tokens.has (actual) then has_more:=false - excpetions.raise("Input String is not well formed JSON, expected %"") + is_parsed:=false + --excpetions.raise("Input String is not well formed JSON, expected %"") + elseif actual.is_equal ('%N') then + next + if not special_characters.has (actual) then + has_more:=false + is_parsed:=false + -- explain exception + else + l_json_string.append (actual.out) + end + elseif special_characters.has (actual) then + has_more:=false + is_parsed:=false + -- explain exception else l_json_string.append (actual.out) end @@ -156,15 +189,20 @@ feature -- Access next skip_withe_spaces l_value := parse - Result.add (l_value) - next - skip_withe_spaces - - if not actual.is_equal (j_array_close) and not actual.is_equal (',')then + if is_parsed then + Result.add (l_value) + next + skip_withe_spaces + if not actual.is_equal (j_array_close) and not actual.is_equal (',')then + flag:=false + is_parsed:=false + --excpetions.raise("%NInput string is not well formed JSON, expected: ',' or ']', and found: " +actual.out+"%N") + elseif actual.is_equal (j_array_close) then + flag:= false + end + else flag:=false - excpetions.raise("%NInput string is not well formed JSON, expected: ',' or ']', and found: " +actual.out+"%N") - elseif actual.is_equal (j_array_close) then - flag:= false + --explain the error end end end @@ -200,7 +238,8 @@ feature -- Access elseif sb.is_integer then create Result.make_integer (sb.to_integer) else - excpetions.raise ("Input string is an not well formed JSON") + is_parsed:=false + -- excpetions.raise ("Input string is an not well formed JSON") -- print ("Input string is an not well formed JSON") end end @@ -245,14 +284,29 @@ feature -- Access end end feature {NONE} - handle_syntax_exception is - -- - do - next - end - excpetions:EXCEPTIONS once - create Result - end + extra_elements:BOOLEAN is + --has more elements? + local + l_string:STRING + do + + if has_next then + next + end + from + until not actual.is_space or not actual.is_equal ('%R') or + not actual.is_equal ('%U') or not actual.is_equal ('%T') + or not actual.is_equal ('%N') or not has_next + loop + next + end + + if has_next then + Result:=True + end + + end + end diff --git a/json/scanner/json_reader.e b/json/scanner/json_reader.e index 2f0521b8..291c4cfb 100644 --- a/json/scanner/json_reader.e +++ b/json/scanner/json_reader.e @@ -1,97 +1,97 @@ -indexing - description: "Objects that ..." - author: "" - date: "$Date$" - revision: "$Revision$" - -class - JSON_READER - -create - make -feature -- Access - make(a_json:STRING) is - -- - do - representation:=a_json - index:=1 - end - - read:CHARACTER is - -- - do - if not representation.is_empty then - Result:= representation.item (index) - end - - end - - - actual:CHARACTER is - -- - do - Result:=representation.item (index) - end - - has_next:BOOLEAN is - -- - do - if index <= representation.count then - Result:=True - end - end - - has_previous:BOOLEAN is - -- - do - if index >=1 then - Result:=True - end - end - next is - -- - require - has_more_elements: has_next - do - index:=index + 1 - ensure - incremented: old index + 1 = index - end - - previous is - -- - require - not_is_first: has_previous - do - index:=index - 1 - ensure - incremented: old index - 1 = index - end - - - skip_withe_spaces is - -- Remove withe spaces - do - from - until not actual.is_space and has_next - loop - next - end - end - - json_substring (start_index, end_index: INTEGER_32):STRING is - -- - do - Result:=representation.substring (start_index, end_index) - end - - - - -feature -- Implementation - representation:STRING - --linear representation of the original json string - index:INTEGER - --actual index - -end +indexing + description: "Objects that ..." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + JSON_READER + +create + make +feature -- Access + make(a_json:STRING) is + -- + do + representation:=a_json + index:=1 + end + + read:CHARACTER is + -- + do + if not representation.is_empty then + Result:= representation.item (index) + end + + end + + + actual:CHARACTER is + -- + do + Result:=representation.item (index) + end + + has_next:BOOLEAN is + -- + do + if index <= representation.count then + Result:=True + end + end + + has_previous:BOOLEAN is + -- + do + if index >=1 then + Result:=True + end + end + next is + -- + require + has_more_elements: has_next + do + index:=index + 1 + ensure + incremented: old index + 1 = index + end + + previous is + -- + require + not_is_first: has_previous + do + index:=index - 1 + ensure + incremented: old index - 1 = index + end + + + skip_withe_spaces is + -- Remove withe spaces + do + from + until not actual.is_space or not has_next + loop + next + end + end + + json_substring (start_index, end_index: INTEGER_32):STRING is + -- + do + Result:=representation.substring (start_index, end_index) + end + + + + +feature -- Implementation + representation:STRING + --linear representation of the original json string + index:INTEGER + --actual index + +end diff --git a/json/scanner/json_tokens.e b/json/scanner/json_tokens.e index 8bf27ac1..c23e0fc6 100644 --- a/json/scanner/json_tokens.e +++ b/json/scanner/json_tokens.e @@ -1,33 +1,47 @@ -indexing - description: "Objects that ..." - author: "" - date: "$Date$" - revision: "$Revision$" - -class - JSON_TOKENS - -feature -- Access - J_OBJECT_OPEN:CHARACTER is '{' - J_ARRAY_OPEN:CHARACTER is '[' - J_OBJECT_CLOSE:CHARACTER is '}' - J_ARRAY_CLOSE:CHARACTER is ']' - - J_STRING:CHARACTER is '"' - J_PLUS:CHARACTER is '+' - J_MINUS:CHARACTER is '-' - J_DOT:CHARACTER is '.' - - open_tokens:ARRAY[CHARACTER] is - -- Characters wich open a type - once - Result:=<> - end - - close_tokens:ARRAY[CHARACTER] is - -- Characters wich close a type - once - Result:=<> - end - -end +indexing + description: "Objects that ..." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + JSON_TOKENS + +feature -- Access + J_OBJECT_OPEN:CHARACTER is '{' + J_ARRAY_OPEN:CHARACTER is '[' + J_OBJECT_CLOSE:CHARACTER is '}' + J_ARRAY_CLOSE:CHARACTER is ']' + + J_STRING:CHARACTER is '"' + J_PLUS:CHARACTER is '+' + J_MINUS:CHARACTER is '-' + J_DOT:CHARACTER is '.' + + open_tokens:ARRAY[CHARACTER] is + -- Characters wich open a type + once + Result:=<> + end + + close_tokens:ARRAY[CHARACTER] is + -- Characters wich close a type + once + Result:=<> + end + + special_characters:ARRAY[CHARACTER] is + -- Control Characters + -- %F Form feed + -- %H backslasH + -- %N Newline + -- %R carriage Return + -- %T horizontal Tab + -- %B Backspace + -- / Solidus + -- " Quotation + do + Result:=<<'%F','%H','%N','%R','%T','%B','/','"'>> + end + +end