diff --git a/generate_state_table.c b/generate_state_table.c index cf67e07..40f7742 100644 --- a/generate_state_table.c +++ b/generate_state_table.c @@ -7,14 +7,18 @@ #define STRING_BUF_LENGTH 100 -INTERNAL void write_table(void); INTERNAL void clear_file(void); -INTERNAL lexer_input_t char_type(char input); -INTERNAL void lexer_state_machine(lexer_input_t input); +INTERNAL void fill_table(void); +INTERNAL void write_table(void); + +INTERNAL void set_column_width(lexer_state_t state); +INTERNAL const char *get_input_string(lexer_input_t input); +INTERNAL const char *get_state_string(lexer_state_t state); + +INTERNAL lexer_state_t lexer_state_machine(lexer_state_t state, + lexer_input_t input); INTERNAL lexer_state_t handle_lexer_start(lexer_input_t input); INTERNAL lexer_state_t handle_last_collection(char input); -INTERNAL lexer_state_t handle_collection_end(lexer_input_t input); -INTERNAL void handle_input_after_collection_end(lexer_input_t input); INTERNAL lexer_state_t handle_object(lexer_input_t input); INTERNAL lexer_state_t handle_array(lexer_input_t input); INTERNAL lexer_state_t handle_key(lexer_input_t input); @@ -39,15 +43,16 @@ INTERNAL lexer_state_t handle_null(lexer_input_t input, lexer_state_t start_state); INTERNAL lexer_state_t handle_keyword_end(lexer_input_t input); -INTERNAL lexer_state_t current_state = LEXER_STATE_START; +INTERNAL i32 column_width = 0; INTERNAL lexer_state_t state_table[COUNT_LEXER_STATES][COUNT_LEXER_INPUTS] = { 0}; - INTERNAL const char *filename = "./include/lexer/lexer_state_transitions.table"; int main(void) { clear_file(); + fill_table(); + write_table(); return EXIT_SUCCESS; @@ -64,6 +69,21 @@ void clear_file(void) { fclose(fp); } +INTERNAL void fill_table(void) { + lexer_state_t state; + lexer_input_t input; + + for (u64 i = 0; i < COUNT_LEXER_STATES; ++i) { + state = (lexer_state_t)i; + + for (u64 j = 0; j < COUNT_LEXER_INPUTS; ++j) { + input = (lexer_input_t)j; + + state_table[i][j] = (lexer_state_t)lexer_state_machine(state, input); + } + } +} + void write_table(void) { FILE *fp = fopen(filename, "a"); @@ -73,23 +93,49 @@ void write_table(void) { return; } + const char *array_open = "{ "; + const u64 array_open_length = strlen(array_open); + + const char *array_close = "},\n"; + const u64 array_close_length = strlen(array_close); + + const char *comment = "//"; + const u64 comment_length = strlen(comment); + + const char *table_header_end = " \n"; + const u64 table_header_end_length = strlen(table_header_end); + char output[STRING_BUF_LENGTH] = {0}; u64 length = 0; for (u64 i = 0; i < COUNT_LEXER_STATES; ++i) { - sprintf(output, "{ "); + set_column_width((lexer_state_t)i); + } + + fwrite(comment, sizeof(char), comment_length, fp); + + i32 column_white_space = 7; + + for (u64 i = 0; i < COUNT_LEXER_INPUTS; ++i) { + sprintf(output, "%*s%*s| ", column_width - column_white_space, + get_input_string((lexer_input_t)i), column_white_space, " "); length = strlen(output); - fwrite(output, 1, length, fp); + fwrite(output, sizeof(char), length, fp); + } + + fwrite(table_header_end, sizeof(char), table_header_end_length, fp); + + for (u64 i = 0; i < COUNT_LEXER_STATES; ++i) { + fwrite(array_open, sizeof(char), array_open_length, fp); for (u64 j = 0; j < COUNT_LEXER_INPUTS; ++j) { - sprintf(output, "%lld, ", (unsigned long long)state_table[i][j]); + sprintf(output, "%*s, ", column_width, + get_state_string((lexer_state_t)state_table[i][j])); length = strlen(output); - fwrite(output, 1, length, fp); + fwrite(output, sizeof(char), length, fp); } - sprintf(output, "},\n"); - length = strlen(output); - fwrite(output, 1, length, fp); + fwrite(array_close, sizeof(char), array_close_length, fp); memset(output, 0, STRING_BUF_LENGTH); } @@ -97,196 +143,715 @@ void write_table(void) { fclose(fp); } -INTERNAL lexer_input_t char_type(char input) { - if (isspace(input)) { - return LEXER_INPUT_WHITE_SPACE; - } else if (input >= '1' && input <= '9') { - return LEXER_INPUT_NON_ZERO; - } +INTERNAL void set_column_width(lexer_state_t state) { + const char *output = ""; + i32 length = 0; - switch (input) { - case '{': - return LEXER_INPUT_OPEN_BRACE; - case '}': - return LEXER_INPUT_CLOSE_BRACE; - case '[': - return LEXER_INPUT_OPEN_BRACKET; - case ']': - return LEXER_INPUT_CLOSE_BRACKET; - case ',': - return LEXER_INPUT_COMMA; - case ':': - return LEXER_INPUT_COLON; - case '"': - return LEXER_INPUT_DOUBLE_QUOTE; - case '\\': - return LEXER_INPUT_BACK_SLASH; - case '/': - return LEXER_INPUT_FORWARD_SLASH; - case 'a': - return LEXER_INPUT_LOWER_A; - case 'b': - return LEXER_INPUT_LOWER_B; - case 'c': - return LEXER_INPUT_LOWER_C; - case 'd': - return LEXER_INPUT_LOWER_D; - case 'e': - return LEXER_INPUT_LOWER_E; - case 'f': - return LEXER_INPUT_LOWER_F; - case 'l': - return LEXER_INPUT_LOWER_L; - case 'n': - return LEXER_INPUT_LOWER_N; - case 'r': - return LEXER_INPUT_LOWER_R; - case 's': - return LEXER_INPUT_LOWER_S; - case 't': - return LEXER_INPUT_LOWER_T; - case 'u': - return LEXER_INPUT_LOWER_U; - case 'A': - return LEXER_INPUT_UPPER_A; - case 'B': - return LEXER_INPUT_UPPER_B; - case 'C': - return LEXER_INPUT_UPPER_C; - case 'D': - return LEXER_INPUT_UPPER_D; - case 'E': - return LEXER_INPUT_UPPER_E; - case 'F': - return LEXER_INPUT_UPPER_F; - case '-': - return LEXER_INPUT_MINUS; - case '+': - return LEXER_INPUT_PLUS; - case '.': - return LEXER_INPUT_DECIMAL; - case '0': - return LEXER_INPUT_ZERO; - default: - return LEXER_INPUT_OTHER; + switch (state) { + case LEXER_STATE_ERROR: + output = "LEXER_STATE_ERROR"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_START: + output = "LEXER_STATE_START"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_VALUE: + output = "LEXER_STATE_VALUE"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_VALUE_END: + output = "LEXER_STATE_VALUE_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_OBJECT_START: + output = "LEXER_STATE_OBJECT_START"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_OBJECT: + output = "LEXER_STATE_OBJECT"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_OBJECT_END: + output = "LEXER_STATE_OBJECT_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_ARRAY_START: + output = "LEXER_STATE_ARRAY_START"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_ARRAY: + output = "LEXER_STATE_ARRAY"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_ARRAY_END: + output = "LEXER_STATE_ARRAY_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_LAST_COLLECTION: + output = "LEXER_STATE_LAST_COLLECTION"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_KEY: + output = "LEXER_STATE_KEY"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_KEY_END: + output = "LEXER_STATE_KEY_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_DECIMAL: + output = "LEXER_STATE_DECIMAL"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_NUMBER: + output = "LEXER_STATE_NUMBER"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_FRACTION: + output = "LEXER_STATE_FRACTION"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_EXPONENT: + output = "LEXER_STATE_EXPONENT"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_EXP_SIGN: + output = "LEXER_STATE_EXP_SIGN"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_POWER: + output = "LEXER_STATE_POWER"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_NUMBER_END: + output = "LEXER_STATE_NUMBER_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_STRING: + output = "LEXER_STATE_STRING"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_STRING_END: + output = "LEXER_STATE_STRING_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_ESCAPE_SEQUENCE: + output = "LEXER_STATE_ESCAPE_SEQUENCE"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_UNICODE_HEX1: + output = "LEXER_STATE_UNICODE_HEX1"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_UNICODE_HEX2: + output = "LEXER_STATE_UNICODE_HEX2"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_UNICODE_HEX3: + output = "LEXER_STATE_UNICODE_HEX3"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_UNICODE_HEX4: + output = "LEXER_STATE_UNICODE_HEX4"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_T: + output = "LEXER_STATE_T"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_TR: + output = "LEXER_STATE_TR"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_TRU: + output = "LEXER_STATE_TRU"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_TRUE: + output = "LEXER_STATE_TRUE"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_F: + output = "LEXER_STATE_F"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_FA: + output = "LEXER_STATE_FA"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_FAL: + output = "LEXER_STATE_FAL"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_FALS: + output = "LEXER_STATE_FALS"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_FALSE: + output = "LEXER_STATE_FALSE"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_N: + output = "LEXER_STATE_N"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_NU: + output = "LEXER_STATE_NU"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_NUL: + output = "LEXER_STATE_NUL"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_NULL: + output = "LEXER_STATE_NULL"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case LEXER_STATE_KEYWORD_END: + output = "LEXER_STATE_KEYWORD_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + case COUNT_LEXER_STATES: + break; } } -void lexer_state_machine(lexer_input_t input) { - switch (current_state) { +INTERNAL const char *get_input_string(lexer_input_t input) { + switch (input) { + case LEXER_INPUT_WHITE_SPACE: + return "WHITE_SPACE"; + case LEXER_INPUT_OPEN_BRACE: + return "OPEN_BRACE"; + case LEXER_INPUT_CLOSE_BRACE: + return "CLOSE_BRACE"; + case LEXER_INPUT_OPEN_BRACKET: + return "OPEN_BRACKET"; + case LEXER_INPUT_CLOSE_BRACKET: + return "CLOSE_BRACKET"; + case LEXER_INPUT_COMMA: + return "COMMA"; + case LEXER_INPUT_COLON: + return "COLON"; + case LEXER_INPUT_DOUBLE_QUOTE: + return "DOUBLE_QUOTE"; + case LEXER_INPUT_BACK_SLASH: + return "BACK_SLASH"; + case LEXER_INPUT_FORWARD_SLASH: + return "FORWARD_SLASH"; + case LEXER_INPUT_LOWER_A: + return "LOWER_A"; + case LEXER_INPUT_LOWER_B: + return "LOWER_B"; + case LEXER_INPUT_LOWER_C: + return "LOWER_C"; + case LEXER_INPUT_LOWER_D: + return "LOWER_D"; + case LEXER_INPUT_LOWER_E: + return "LOWER_E"; + case LEXER_INPUT_LOWER_F: + return "LOWER_F"; + case LEXER_INPUT_LOWER_L: + return "LOWER_L"; + case LEXER_INPUT_LOWER_N: + return "LOWER_N"; + case LEXER_INPUT_LOWER_R: + return "LOWER_R"; + case LEXER_INPUT_LOWER_S: + return "LOWER_S"; + case LEXER_INPUT_LOWER_T: + return "LOWER_T"; + case LEXER_INPUT_LOWER_U: + return "LOWER_U"; + case LEXER_INPUT_UPPER_A: + return "UPPER_A"; + case LEXER_INPUT_UPPER_B: + return "UPPER_B"; + case LEXER_INPUT_UPPER_C: + return "UPPER_C"; + case LEXER_INPUT_UPPER_D: + return "UPPER_D"; + case LEXER_INPUT_UPPER_E: + return "UPPER_E"; + case LEXER_INPUT_UPPER_F: + return "UPPER_F"; + case LEXER_INPUT_MINUS: + return "MINUS"; + case LEXER_INPUT_PLUS: + return "PLUS"; + case LEXER_INPUT_DECIMAL: + return "DECIMAL"; + case LEXER_INPUT_ZERO: + return "ZERO"; + case LEXER_INPUT_NON_ZERO: + return "NON_ZERO"; + case LEXER_INPUT_OTHER: + return "OTHER"; + + case COUNT_LEXER_INPUTS: + return ""; + } +} + +INTERNAL const char *get_state_string(lexer_state_t state) { + const char *output = ""; + i32 length = 0; + + switch (state) { + case LEXER_STATE_ERROR: + output = "LEXER_STATE_ERROR"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; case LEXER_STATE_START: - current_state = handle_lexer_start(input); - break; + output = "LEXER_STATE_START"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; case LEXER_STATE_VALUE: - current_state = handle_value(input); - break; + output = "LEXER_STATE_VALUE"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_VALUE_END: + output = "LEXER_STATE_VALUE_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; case LEXER_STATE_OBJECT_START: + output = "LEXER_STATE_OBJECT_START"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; case LEXER_STATE_OBJECT: - current_state = handle_object(input); - break; + output = "LEXER_STATE_OBJECT"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_OBJECT_END: + output = "LEXER_STATE_OBJECT_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; case LEXER_STATE_ARRAY_START: + output = "LEXER_STATE_ARRAY_START"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; case LEXER_STATE_ARRAY: - current_state = handle_array(input); - break; + output = "LEXER_STATE_ARRAY"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_ARRAY_END: + output = "LEXER_STATE_ARRAY_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_LAST_COLLECTION: + output = "LEXER_STATE_LAST_COLLECTION"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_KEY: + output = "LEXER_STATE_KEY"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_KEY_END: + output = "LEXER_STATE_KEY_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_DECIMAL: + output = "LEXER_STATE_DECIMAL"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_NUMBER: + output = "LEXER_STATE_NUMBER"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_FRACTION: + output = "LEXER_STATE_FRACTION"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_EXPONENT: + output = "LEXER_STATE_EXPONENT"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_EXP_SIGN: + output = "LEXER_STATE_EXP_SIGN"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_POWER: + output = "LEXER_STATE_POWER"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_NUMBER_END: + output = "LEXER_STATE_NUMBER_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_STRING: + output = "LEXER_STATE_STRING"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_STRING_END: + output = "LEXER_STATE_STRING_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_ESCAPE_SEQUENCE: + output = "LEXER_STATE_ESCAPE_SEQUENCE"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_UNICODE_HEX1: + output = "LEXER_STATE_UNICODE_HEX1"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_UNICODE_HEX2: + output = "LEXER_STATE_UNICODE_HEX2"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_UNICODE_HEX3: + output = "LEXER_STATE_UNICODE_HEX3"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_UNICODE_HEX4: + output = "LEXER_STATE_UNICODE_HEX4"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_T: + output = "LEXER_STATE_T"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_TR: + output = "LEXER_STATE_TR"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_TRU: + output = "LEXER_STATE_TRU"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_TRUE: + output = "LEXER_STATE_TRUE"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_F: + output = "LEXER_STATE_F"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_FA: + output = "LEXER_STATE_FA"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_FAL: + output = "LEXER_STATE_FAL"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_FALS: + output = "LEXER_STATE_FALS"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_FALSE: + output = "LEXER_STATE_FALSE"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_N: + output = "LEXER_STATE_N"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_NU: + output = "LEXER_STATE_NU"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_NUL: + output = "LEXER_STATE_NUL"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_NULL: + output = "LEXER_STATE_NULL"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + case LEXER_STATE_KEYWORD_END: + output = "LEXER_STATE_KEYWORD_END"; + length = strlen(output); + + column_width = length > column_width ? length : column_width; + + return output; + + case COUNT_LEXER_STATES: + return ""; + } +} + +lexer_state_t lexer_state_machine(lexer_state_t state, lexer_input_t input) { + switch (state) { + case LEXER_STATE_START: + return handle_lexer_start(input); + case LEXER_STATE_VALUE: + return handle_value(input); + case LEXER_STATE_OBJECT: + return handle_object(input); + case LEXER_STATE_ARRAY: + return handle_array(input); + case LEXER_STATE_KEY: + return handle_key(input); + case LEXER_STATE_DECIMAL: + return handle_decimal(input); + case LEXER_STATE_NUMBER: + return handle_number(input); + case LEXER_STATE_FRACTION: + return handle_fraction(input); + case LEXER_STATE_EXPONENT: + return handle_exponent(input); + case LEXER_STATE_EXP_SIGN: + return handle_exp_sign(input); + case LEXER_STATE_POWER: + return handle_power(input); + case LEXER_STATE_NUMBER_END: + return handle_number_end(input); + case LEXER_STATE_STRING: + return handle_string(input); + case LEXER_STATE_STRING_END: + return handle_string_end(input); + case LEXER_STATE_ESCAPE_SEQUENCE: + return handle_escape_sequence(input); + case LEXER_STATE_UNICODE_HEX1: + return handle_unicode_hex(input, LEXER_STATE_UNICODE_HEX2); + case LEXER_STATE_UNICODE_HEX2: + return handle_unicode_hex(input, LEXER_STATE_UNICODE_HEX3); + case LEXER_STATE_UNICODE_HEX3: + return handle_unicode_hex(input, LEXER_STATE_UNICODE_HEX4); + case LEXER_STATE_UNICODE_HEX4: + return handle_unicode_hex(input, LEXER_STATE_STRING); + case LEXER_STATE_T: + return handle_true(input, LEXER_STATE_T); + case LEXER_STATE_TR: + return handle_true(input, LEXER_STATE_TR); + case LEXER_STATE_TRU: + return handle_true(input, LEXER_STATE_TRU); + case LEXER_STATE_TRUE: + return handle_true(input, LEXER_STATE_TRUE); + case LEXER_STATE_F: + return handle_false(input, LEXER_STATE_F); + case LEXER_STATE_FA: + return handle_false(input, LEXER_STATE_FA); + case LEXER_STATE_FAL: + return handle_false(input, LEXER_STATE_FAL); + case LEXER_STATE_FALS: + return handle_false(input, LEXER_STATE_FALS); + case LEXER_STATE_FALSE: + return handle_false(input, LEXER_STATE_FALSE); + case LEXER_STATE_N: + return handle_null(input, LEXER_STATE_N); + case LEXER_STATE_NU: + return handle_null(input, LEXER_STATE_NU); + case LEXER_STATE_NUL: + return handle_null(input, LEXER_STATE_NUL); + case LEXER_STATE_NULL: + return handle_null(input, LEXER_STATE_NULL); + case LEXER_STATE_KEYWORD_END: + return handle_keyword_end(input); + case LEXER_STATE_LAST_COLLECTION: + return handle_last_collection(input); + case LEXER_STATE_OBJECT_START: + case LEXER_STATE_ARRAY_START: case LEXER_STATE_OBJECT_END: case LEXER_STATE_ARRAY_END: - handle_input_after_collection_end(input); - - break; - case LEXER_STATE_KEY: - current_state = handle_key(input); - break; - case LEXER_STATE_DECIMAL: - current_state = handle_decimal(input); - break; - case LEXER_STATE_NUMBER: - current_state = handle_number(input); - break; - case LEXER_STATE_FRACTION: - current_state = handle_fraction(input); - break; - case LEXER_STATE_EXPONENT: - current_state = handle_exponent(input); - break; - case LEXER_STATE_EXP_SIGN: - current_state = handle_exp_sign(input); - break; - case LEXER_STATE_POWER: - current_state = handle_power(input); - break; - case LEXER_STATE_NUMBER_END: - current_state = handle_number_end(input); - break; - case LEXER_STATE_STRING: - current_state = handle_string(input); - break; - case LEXER_STATE_STRING_END: - current_state = handle_string_end(input); - break; - case LEXER_STATE_ESCAPE_SEQUENCE: - current_state = handle_escape_sequence(input); - break; - case LEXER_STATE_UNICODE_HEX1: - current_state = handle_unicode_hex(input, LEXER_STATE_UNICODE_HEX2); - break; - case LEXER_STATE_UNICODE_HEX2: - current_state = handle_unicode_hex(input, LEXER_STATE_UNICODE_HEX3); - break; - case LEXER_STATE_UNICODE_HEX3: - current_state = handle_unicode_hex(input, LEXER_STATE_UNICODE_HEX4); - break; - case LEXER_STATE_UNICODE_HEX4: - current_state = handle_unicode_hex(input, LEXER_STATE_STRING); - break; - case LEXER_STATE_T: - current_state = handle_true(input, LEXER_STATE_T); - break; - case LEXER_STATE_TR: - current_state = handle_true(input, LEXER_STATE_TR); - break; - case LEXER_STATE_TRU: - current_state = handle_true(input, LEXER_STATE_TRU); - break; - case LEXER_STATE_TRUE: - current_state = handle_true(input, LEXER_STATE_TRUE); - break; - case LEXER_STATE_F: - current_state = handle_false(input, LEXER_STATE_F); - break; - case LEXER_STATE_FA: - current_state = handle_false(input, LEXER_STATE_FA); - break; - case LEXER_STATE_FAL: - current_state = handle_false(input, LEXER_STATE_FAL); - break; - case LEXER_STATE_FALS: - current_state = handle_false(input, LEXER_STATE_FALS); - break; - case LEXER_STATE_FALSE: - current_state = handle_false(input, LEXER_STATE_FALSE); - break; - case LEXER_STATE_N: - current_state = handle_null(input, LEXER_STATE_N); - break; - case LEXER_STATE_NU: - current_state = handle_null(input, LEXER_STATE_NU); - break; - case LEXER_STATE_NUL: - current_state = handle_null(input, LEXER_STATE_NUL); - break; - case LEXER_STATE_NULL: - current_state = handle_null(input, LEXER_STATE_NULL); - break; - case LEXER_STATE_KEYWORD_END: - current_state = handle_keyword_end(input); - break; - case LEXER_STATE_LAST_COLLECTION: - current_state = handle_last_collection(input); - break; + case LEXER_STATE_KEY_END: + case LEXER_STATE_VALUE_END: case LEXER_STATE_ERROR: case COUNT_LEXER_STATES: - current_state = LEXER_STATE_ERROR; - break; + return LEXER_STATE_ERROR; } } @@ -311,71 +876,6 @@ lexer_state_t handle_last_collection(char input) { return LEXER_STATE_ERROR; } -// TODO (Abdelrahman): Figure out how to handle this -lexer_state_t handle_collection_end(lexer_input_t input) { - // No need to ignore space as this is only called when input is } or ] - - lexer->current = lexer->stack.stack[lexer->stack.size - 1]; - - bool object_end = lexer->current == LEXER_STATE_OBJECT && input == '}'; - - if (object_end) { - token_t *token; - - if (lexer->token_ready) { - lexer->has_extra_token = true; - token = &(lexer->extra_token); - } else { - lexer->token_ready = true; - token = &(lexer->token); - } - - set_token(token, lexer->line, lexer->column, TK_R_BRACE, - (token_value_t){0}); - - return LEXER_STATE_OBJECT_END; - } - - bool array_end = lexer->current == LEXER_STATE_ARRAY && input == ']'; - - if (array_end) { - token_t *token; - - if (lexer->token_ready) { - lexer->has_extra_token = true; - token = &(lexer->extra_token); - } else { - lexer->token_ready = true; - token = &(lexer->token); - } - - set_token(token, lexer->line, lexer->column, TK_R_BRACKET, - (token_value_t){0}); - - return LEXER_STATE_ARRAY_END; - } - - return LEXER_STATE_ERROR; -} - -// TODO (Abdelrahman): Figure out how to handle this -void handle_input_after_collection_end(lexer_input_t input) { - switch (input) { - case '}': - lexer->token_ready = true; - set_token(&(lexer->token), lexer->line, lexer->column, TK_R_BRACE, - (token_value_t){0}); - - break; - case ']': - lexer->token_ready = true; - set_token(&(lexer->token), lexer->line, lexer->column, TK_R_BRACKET, - (token_value_t){0}); - - break; - } -} - lexer_state_t handle_object(lexer_input_t input) { switch (input) { case LEXER_INPUT_WHITE_SPACE: @@ -383,7 +883,7 @@ lexer_state_t handle_object(lexer_input_t input) { case LEXER_INPUT_DOUBLE_QUOTE: return LEXER_STATE_KEY; case LEXER_INPUT_CLOSE_BRACE: - return handle_collection_end(input); + return LEXER_STATE_OBJECT_END; default: return LEXER_STATE_ERROR; } @@ -394,7 +894,7 @@ lexer_state_t handle_array(lexer_input_t input) { case LEXER_INPUT_WHITE_SPACE: return LEXER_STATE_ARRAY; case LEXER_INPUT_CLOSE_BRACKET: - return handle_collection_end(input); + return LEXER_STATE_ARRAY_END; default: return handle_value(input); } @@ -439,31 +939,21 @@ lexer_state_t handle_string(lexer_input_t input) { } } -// TODO (Abdelrahman): Figure out how to handle this lexer_state_t handle_string_end(lexer_input_t input) { switch (input) { case LEXER_INPUT_WHITE_SPACE: return LEXER_STATE_STRING_END; + case LEXER_INPUT_COLON: + return LEXER_STATE_KEY_END; + case LEXER_INPUT_COMMA: + return LEXER_STATE_VALUE_END; + case LEXER_INPUT_CLOSE_BRACE: + return LEXER_STATE_OBJECT_END; + case LEXER_INPUT_CLOSE_BRACKET: + return LEXER_STATE_ARRAY_END; + default: + return LEXER_STATE_ERROR; } - - lexer->current = stack_pop(&(lexer->stack)); - - bool key_end = lexer->current == LEXER_STATE_KEY && input == ':'; - - if (key_end) { - return LEXER_STATE_VALUE; - } - - bool value_end = lexer->current == LEXER_STATE_VALUE && input == ','; - - if (value_end) { - return lexer->stack.stack[lexer->stack.size - 1]; - } - - bool collection_end = input == '}' || input == ']'; - - return collection_end ? handle_collection_end(lexer, input) - : LEXER_STATE_ERROR; } lexer_state_t handle_escape_sequence(lexer_input_t input) { @@ -523,11 +1013,11 @@ lexer_state_t handle_number(lexer_input_t input) { case LEXER_INPUT_DECIMAL: return LEXER_STATE_FRACTION; case LEXER_INPUT_CLOSE_BRACE: + return LEXER_STATE_OBJECT_END; case LEXER_INPUT_CLOSE_BRACKET: - return handle_collection_end(input); + return LEXER_STATE_ARRAY_END; case LEXER_INPUT_COMMA: - // TODO (Abdelrahman): Figure out how to handle this - return lexer->stack.stack[lexer->stack.size - 1]; + return LEXER_STATE_VALUE_END; case LEXER_INPUT_WHITE_SPACE: return LEXER_STATE_NUMBER_END; default: @@ -541,14 +1031,14 @@ lexer_state_t handle_fraction(lexer_input_t input) { case LEXER_INPUT_NON_ZERO: return LEXER_STATE_FRACTION; case LEXER_INPUT_CLOSE_BRACE: + return LEXER_STATE_OBJECT_END; case LEXER_INPUT_CLOSE_BRACKET: - return handle_collection_end(input); + return LEXER_STATE_ARRAY_END; case LEXER_INPUT_LOWER_E: case LEXER_INPUT_UPPER_E: return LEXER_STATE_EXPONENT; case LEXER_INPUT_COMMA: - // TODO (Abdelrahman): Figure out how to handle this - return lexer->stack.stack[lexer->stack.size - 1]; + return LEXER_STATE_VALUE_END; case LEXER_INPUT_WHITE_SPACE: return LEXER_STATE_NUMBER_END; default: @@ -585,11 +1075,11 @@ lexer_state_t handle_power(lexer_input_t input) { case LEXER_INPUT_NON_ZERO: return LEXER_STATE_POWER; case LEXER_INPUT_CLOSE_BRACE: + return LEXER_STATE_OBJECT_END; case LEXER_INPUT_CLOSE_BRACKET: - return handle_collection_end(input); + return LEXER_STATE_ARRAY_END; case LEXER_INPUT_COMMA: - // TODO (Abdelrahman): Figure out how to handle this - return lexer->stack.stack[lexer->stack.size - 1]; + return LEXER_STATE_VALUE_END; case LEXER_INPUT_WHITE_SPACE: return LEXER_STATE_NUMBER_END; default: @@ -602,11 +1092,11 @@ lexer_state_t handle_number_end(lexer_input_t input) { case LEXER_INPUT_WHITE_SPACE: return LEXER_STATE_NUMBER_END; case LEXER_INPUT_CLOSE_BRACE: + return LEXER_STATE_OBJECT_END; case LEXER_INPUT_CLOSE_BRACKET: - return handle_collection_end(input); + return LEXER_STATE_ARRAY_END; case LEXER_INPUT_COMMA: - // TODO (Abdelrahman): Figure out how to handle this - return lexer->stack.stack[lexer->stack.size - 1]; + return LEXER_STATE_VALUE_END; default: return LEXER_STATE_ERROR; } @@ -664,11 +1154,11 @@ lexer_state_t handle_keyword_end(lexer_input_t input) { case LEXER_INPUT_WHITE_SPACE: return LEXER_STATE_KEYWORD_END; case LEXER_INPUT_CLOSE_BRACE: + return LEXER_STATE_OBJECT_END; case LEXER_INPUT_CLOSE_BRACKET: - return handle_collection_end(input); + return LEXER_STATE_ARRAY_END; case LEXER_INPUT_COMMA: - // TODO (Abdelrahman): Figure out how to handle this - return lexer->stack.stack[lexer->stack.size - 1]; + return LEXER_STATE_VALUE_END; default: return LEXER_STATE_ERROR; } diff --git a/include/lexer/lexer_data.h b/include/lexer/lexer_data.h index 9463a9e..1327eda 100644 --- a/include/lexer/lexer_data.h +++ b/include/lexer/lexer_data.h @@ -6,6 +6,7 @@ typedef enum { LEXER_STATE_ERROR, LEXER_STATE_START, LEXER_STATE_VALUE, + LEXER_STATE_VALUE_END, // COLLECTION STATES LEXER_STATE_OBJECT_START, LEXER_STATE_OBJECT, @@ -16,6 +17,7 @@ typedef enum { LEXER_STATE_LAST_COLLECTION, // OBJECT STATES LEXER_STATE_KEY, + LEXER_STATE_KEY_END, // NUMBER STATES LEXER_STATE_DECIMAL, LEXER_STATE_NUMBER, diff --git a/include/lexer/lexer_state_transitions.table b/include/lexer/lexer_state_transitions.table index 5808a0d..beea5b7 100644 --- a/include/lexer/lexer_state_transitions.table +++ b/include/lexer/lexer_state_transitions.table @@ -1,38 +1,42 @@ -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, +// WHITE_SPACE | OPEN_BRACE | CLOSE_BRACE | OPEN_BRACKET | CLOSE_BRACKET | COMMA | COLON | DOUBLE_QUOTE | BACK_SLASH | FORWARD_SLASH | LOWER_A | LOWER_B | LOWER_C | LOWER_D | LOWER_E | LOWER_F | LOWER_L | LOWER_N | LOWER_R | LOWER_S | LOWER_T | LOWER_U | UPPER_A | UPPER_B | UPPER_C | UPPER_D | UPPER_E | UPPER_F | MINUS | PLUS | DECIMAL | ZERO | NON_ZERO | OTHER | +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_START, LEXER_STATE_OBJECT_START, LEXER_STATE_ERROR, LEXER_STATE_ARRAY_START, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_VALUE, LEXER_STATE_OBJECT_START, LEXER_STATE_ERROR, LEXER_STATE_ARRAY_START, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_F, LEXER_STATE_ERROR, LEXER_STATE_N, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_T, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_NUMBER, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_DECIMAL, LEXER_STATE_NUMBER, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_OBJECT, LEXER_STATE_ERROR, LEXER_STATE_OBJECT_END, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_KEY, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ARRAY, LEXER_STATE_OBJECT_START, LEXER_STATE_ERROR, LEXER_STATE_ARRAY_START, LEXER_STATE_ARRAY_END, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_F, LEXER_STATE_ERROR, LEXER_STATE_N, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_T, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_NUMBER, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_DECIMAL, LEXER_STATE_NUMBER, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_LAST_COLLECTION, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_FRACTION, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_NUMBER_END, LEXER_STATE_ERROR, LEXER_STATE_OBJECT_END, LEXER_STATE_ERROR, LEXER_STATE_ARRAY_END, LEXER_STATE_VALUE_END, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_FRACTION, LEXER_STATE_NUMBER, LEXER_STATE_NUMBER, LEXER_STATE_ERROR, }, +{ LEXER_STATE_NUMBER_END, LEXER_STATE_ERROR, LEXER_STATE_OBJECT_END, LEXER_STATE_ERROR, LEXER_STATE_ARRAY_END, LEXER_STATE_VALUE_END, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_EXPONENT, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_EXPONENT, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_FRACTION, LEXER_STATE_FRACTION, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_EXP_SIGN, LEXER_STATE_EXP_SIGN, LEXER_STATE_ERROR, LEXER_STATE_POWER, LEXER_STATE_POWER, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_POWER, LEXER_STATE_POWER, LEXER_STATE_ERROR, }, +{ LEXER_STATE_NUMBER_END, LEXER_STATE_ERROR, LEXER_STATE_OBJECT_END, LEXER_STATE_ERROR, LEXER_STATE_ARRAY_END, LEXER_STATE_VALUE_END, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_POWER, LEXER_STATE_POWER, LEXER_STATE_ERROR, }, +{ LEXER_STATE_NUMBER_END, LEXER_STATE_ERROR, LEXER_STATE_OBJECT_END, LEXER_STATE_ERROR, LEXER_STATE_ARRAY_END, LEXER_STATE_VALUE_END, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING_END, LEXER_STATE_ESCAPE_SEQUENCE, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, }, +{ LEXER_STATE_STRING_END, LEXER_STATE_ERROR, LEXER_STATE_OBJECT_END, LEXER_STATE_ERROR, LEXER_STATE_ARRAY_END, LEXER_STATE_VALUE_END, LEXER_STATE_KEY_END, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_UNICODE_HEX1, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_UNICODE_HEX2, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_UNICODE_HEX3, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_UNICODE_HEX4, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_STRING, LEXER_STATE_STRING, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_TR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_TRU, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_TRUE, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_FA, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_FAL, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_FALS, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_FALSE, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_NU, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_NUL, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_NULL, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, }, +{ LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, LEXER_STATE_KEYWORD_END, }, +{ LEXER_STATE_KEYWORD_END, LEXER_STATE_ERROR, LEXER_STATE_OBJECT_END, LEXER_STATE_ERROR, LEXER_STATE_ARRAY_END, LEXER_STATE_VALUE_END, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, LEXER_STATE_ERROR, },