Browse Source

Fix som JSON parsing bugs.

- Single digit integer keys `{"a": 5}`
` Negative float keys `{"b": -42.0}`
Kevin Watters 6 years ago
parent
commit
88e1b93786
1 changed files with 20 additions and 18 deletions
  1. 20 18
      core/encoding/json/tokenizer.odin

+ 20 - 18
core/encoding/json/tokenizer.odin

@@ -68,12 +68,12 @@ next_rune :: proc(t: ^Tokenizer) -> rune #no_bounds_check {
 get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
 	skip_digits :: proc(t: ^Tokenizer) {
 		for t.offset < len(t.data) {
-			next_rune(t);
 			if '0' <= t.r && t.r <= '9' {
 				// Okay
 			} else {
 				return;
 			}
+			next_rune(t);
 		}
 	}
 	skip_hex_digits :: proc(t: ^Tokenizer) {
@@ -158,6 +158,7 @@ get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
 	skip_whitespace(t);
 
 	token.pos = t.pos;
+
 	token.kind = Kind.Invalid;
 
 	curr_rune := t.r;
@@ -213,23 +214,6 @@ get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
 		}
 		fallthrough;
 
-	case '.':
-		err = Error.Illegal_Character;
-		if t.spec == Specification.JSON5 { // Allow leading decimal point
-			skip_digits(t);
-			if t.r == 'e' || t.r == 'E' {
-				switch r := next_rune(t); r {
-				case '+', '-':
-					next_rune(t);
-				}
-				skip_digits(t);
-			}
-			str := string(t.data[token.offset:t.offset]);
-			if !is_valid_number(str, t.spec) {
-				err = Error.Invalid_Number;
-			}
-		}
-
 	case '0'..'9':
 		token.kind = Kind.Integer;
 		if t.spec == Specification.JSON5 { // Hexadecimal Numbers
@@ -241,6 +225,7 @@ get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
 		}
 
 		skip_digits(t);
+
 		if t.r == '.' {
 			token.kind = Kind.Float;
 			next_rune(t);
@@ -259,6 +244,23 @@ get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
 			err = Error.Invalid_Number;
 		}
 
+	case '.':
+		err = Error.Illegal_Character;
+		if t.spec == Specification.JSON5 { // Allow leading decimal point
+			skip_digits(t);
+			if t.r == 'e' || t.r == 'E' {
+				switch r := next_rune(t); r {
+				case '+', '-':
+					next_rune(t);
+				}
+				skip_digits(t);
+			}
+			str := string(t.data[token.offset:t.offset]);
+			if !is_valid_number(str, t.spec) {
+				err = Error.Invalid_Number;
+			}
+		}
+
 
 	case '\'':
 		err = Error.Illegal_Character;