From 527ac2368ff908f2ba81afdd4b1dda88eccdb936 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 11 Dec 2024 00:23:41 +0100 Subject: [PATCH] adding more number types --- grammar.js | 17 +- src/grammar.json | 49 +++- src/node-types.json | 52 +++- src/parser.c | 607 ++++++++++++++++++++++++++--------------- test/corpus/values.txt | 23 +- 5 files changed, 512 insertions(+), 236 deletions(-) diff --git a/grammar.js b/grammar.js index 0757f79..7ddd4e6 100644 --- a/grammar.js +++ b/grammar.js @@ -4,7 +4,7 @@ module.exports = grammar({ name: "dotenv", - extras: $ => [ + extras: _ => [ /\s/ ], @@ -31,7 +31,7 @@ module.exports = grammar({ _value: $ => choice( $.string, $.string_interpolation, - $.integer, + $.number, $.boolean, $.value, alias($._empty_value, $.value), @@ -49,10 +49,23 @@ module.exports = grammar({ '"', ), + // Strings + string_content: _ => token(/[^']*/), string_interpolation_content: _ => token(/[^"]*/), + // Numbers + + number: $ => choice( + $.integer, + $.float, + $.hexadecimal, + ), + integer: _ => token(/(\-)?\d+/), + float: _ => seq(/(\-)?\d+/, '.', /\d+/), + hexadecimal: _ => seq('0x', /[0-9a-fA-F]+/), + boolean: _ => token(choice('true', 'false')), value: _ => token(prec(-1, /[^\#\=\s]+/)), diff --git a/src/grammar.json b/src/grammar.json index d82980d..23687a4 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -75,7 +75,7 @@ }, { "type": "SYMBOL", - "name": "integer" + "name": "number" }, { "type": "SYMBOL", @@ -149,6 +149,23 @@ "value": "[^\"]*" } }, + "number": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "integer" + }, + { + "type": "SYMBOL", + "name": "float" + }, + { + "type": "SYMBOL", + "name": "hexadecimal" + } + ] + }, "integer": { "type": "TOKEN", "content": { @@ -156,6 +173,36 @@ "value": "(\\-)?\\d+" } }, + "float": { + "type": "SEQ", + "members": [ + { + "type": "PATTERN", + "value": "(\\-)?\\d+" + }, + { + "type": "STRING", + "value": "." + }, + { + "type": "PATTERN", + "value": "\\d+" + } + ] + }, + "hexadecimal": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "0x" + }, + { + "type": "PATTERN", + "value": "[0-9a-fA-F]+" + } + ] + }, "boolean": { "type": "TOKEN", "content": { diff --git a/src/node-types.json b/src/node-types.json index 7da3f8c..2e93413 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -22,7 +22,7 @@ "named": true }, { - "type": "integer", + "type": "number", "named": true }, { @@ -65,6 +65,44 @@ ] } }, + { + "type": "float", + "named": true, + "fields": {} + }, + { + "type": "hexadecimal", + "named": true, + "fields": {} + }, + { + "type": "integer", + "named": true, + "fields": {} + }, + { + "type": "number", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "float", + "named": true + }, + { + "type": "hexadecimal", + "named": true + }, + { + "type": "integer", + "named": true + } + ] + } + }, { "type": "string", "named": true, @@ -107,6 +145,14 @@ "type": "'", "named": false }, + { + "type": ".", + "named": false + }, + { + "type": "0x", + "named": false + }, { "type": "=", "named": false @@ -119,10 +165,6 @@ "type": "identifier", "named": true }, - { - "type": "integer", - "named": true - }, { "type": "string_content", "named": true diff --git a/src/parser.c b/src/parser.c index 6f1bfde..1e5be81 100644 --- a/src/parser.c +++ b/src/parser.c @@ -5,11 +5,11 @@ #endif #define LANGUAGE_VERSION 14 -#define STATE_COUNT 16 +#define STATE_COUNT 22 #define LARGE_STATE_COUNT 2 -#define SYMBOL_COUNT 20 +#define SYMBOL_COUNT 28 #define ALIAS_COUNT 0 -#define TOKEN_COUNT 13 +#define TOKEN_COUNT 17 #define EXTERNAL_TOKEN_COUNT 1 #define FIELD_COUNT 2 #define MAX_ALIAS_SEQUENCE_LENGTH 3 @@ -24,17 +24,25 @@ enum ts_symbol_identifiers { anon_sym_DQUOTE = 6, sym_string_content = 7, sym_string_interpolation_content = 8, - sym_integer = 9, - sym_boolean = 10, - sym_value = 11, - sym__empty_value = 12, - sym_document = 13, - sym_assignment = 14, - sym_comment = 15, - sym__value = 16, - sym_string = 17, - sym_string_interpolation = 18, - aux_sym_document_repeat1 = 19, + aux_sym_integer_token1 = 9, + anon_sym_DOT = 10, + aux_sym_float_token1 = 11, + anon_sym_0x = 12, + aux_sym_hexadecimal_token1 = 13, + sym_boolean = 14, + sym_value = 15, + sym__empty_value = 16, + sym_document = 17, + sym_assignment = 18, + sym_comment = 19, + sym__value = 20, + sym_string = 21, + sym_string_interpolation = 22, + sym_number = 23, + sym_integer = 24, + sym_float = 25, + sym_hexadecimal = 26, + aux_sym_document_repeat1 = 27, }; static const char * const ts_symbol_names[] = { @@ -47,7 +55,11 @@ static const char * const ts_symbol_names[] = { [anon_sym_DQUOTE] = "\"", [sym_string_content] = "string_content", [sym_string_interpolation_content] = "string_content", - [sym_integer] = "integer", + [aux_sym_integer_token1] = "integer_token1", + [anon_sym_DOT] = ".", + [aux_sym_float_token1] = "float_token1", + [anon_sym_0x] = "0x", + [aux_sym_hexadecimal_token1] = "hexadecimal_token1", [sym_boolean] = "boolean", [sym_value] = "value", [sym__empty_value] = "value", @@ -57,6 +69,10 @@ static const char * const ts_symbol_names[] = { [sym__value] = "_value", [sym_string] = "string", [sym_string_interpolation] = "string_interpolation", + [sym_number] = "number", + [sym_integer] = "integer", + [sym_float] = "float", + [sym_hexadecimal] = "hexadecimal", [aux_sym_document_repeat1] = "document_repeat1", }; @@ -70,7 +86,11 @@ static const TSSymbol ts_symbol_map[] = { [anon_sym_DQUOTE] = anon_sym_DQUOTE, [sym_string_content] = sym_string_content, [sym_string_interpolation_content] = sym_string_content, - [sym_integer] = sym_integer, + [aux_sym_integer_token1] = aux_sym_integer_token1, + [anon_sym_DOT] = anon_sym_DOT, + [aux_sym_float_token1] = aux_sym_float_token1, + [anon_sym_0x] = anon_sym_0x, + [aux_sym_hexadecimal_token1] = aux_sym_hexadecimal_token1, [sym_boolean] = sym_boolean, [sym_value] = sym_value, [sym__empty_value] = sym_value, @@ -80,6 +100,10 @@ static const TSSymbol ts_symbol_map[] = { [sym__value] = sym__value, [sym_string] = sym_string, [sym_string_interpolation] = sym_string_interpolation, + [sym_number] = sym_number, + [sym_integer] = sym_integer, + [sym_float] = sym_float, + [sym_hexadecimal] = sym_hexadecimal, [aux_sym_document_repeat1] = aux_sym_document_repeat1, }; @@ -120,9 +144,25 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, - [sym_integer] = { + [aux_sym_integer_token1] = { + .visible = false, + .named = false, + }, + [anon_sym_DOT] = { .visible = true, - .named = true, + .named = false, + }, + [aux_sym_float_token1] = { + .visible = false, + .named = false, + }, + [anon_sym_0x] = { + .visible = true, + .named = false, + }, + [aux_sym_hexadecimal_token1] = { + .visible = false, + .named = false, }, [sym_boolean] = { .visible = true, @@ -160,6 +200,22 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, + [sym_number] = { + .visible = true, + .named = true, + }, + [sym_integer] = { + .visible = true, + .named = true, + }, + [sym_float] = { + .visible = true, + .named = true, + }, + [sym_hexadecimal] = { + .visible = true, + .named = true, + }, [aux_sym_document_repeat1] = { .visible = false, .named = false, @@ -212,6 +268,12 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [13] = 13, [14] = 14, [15] = 15, + [16] = 16, + [17] = 17, + [18] = 18, + [19] = 19, + [20] = 20, + [21] = 21, }; static bool ts_lex(TSLexer *lexer, TSStateId state) { @@ -219,229 +281,263 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { eof = lexer->eof(lexer); switch (state) { case 0: - if (eof) ADVANCE(3); - if (lookahead == '"') ADVANCE(16); - if (lookahead == '#') ADVANCE(5); - if (lookahead == '\'') ADVANCE(15); - if (lookahead == '-') ADVANCE(29); - if (lookahead == '=') ADVANCE(4); - if (lookahead == 'f') ADVANCE(8); - if (lookahead == 't') ADVANCE(11); + if (eof) ADVANCE(4); + ADVANCE_MAP( + '"', 17, + '#', 6, + '\'', 16, + '-', 35, + '.', 24, + '=', 5, + 'f', 9, + 't', 12, + ); if (('\t' <= lookahead && lookahead <= '\r') || lookahead == ' ') SKIP(0); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(21); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(23); if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(14); - if (lookahead != 0) ADVANCE(30); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(15); + if (lookahead != 0) ADVANCE(36); END_STATE(); case 1: - if (lookahead == '"') ADVANCE(16); - if (lookahead == '\'') ADVANCE(15); - if (lookahead == '-') ADVANCE(29); - if (lookahead == 'f') ADVANCE(23); - if (lookahead == 't') ADVANCE(26); + if (lookahead == '"') ADVANCE(17); + if (lookahead == '\'') ADVANCE(16); + if (lookahead == '-') ADVANCE(35); + if (lookahead == '0') ADVANCE(22); + if (lookahead == 'f') ADVANCE(29); + if (lookahead == 't') ADVANCE(32); if (('\t' <= lookahead && lookahead <= '\r') || lookahead == ' ') SKIP(1); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(21); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(23); if (lookahead != 0 && lookahead != '"' && lookahead != '#' && - lookahead != '=') ADVANCE(30); + lookahead != '=') ADVANCE(36); END_STATE(); case 2: - if (eof) ADVANCE(3); - if (lookahead == '#') ADVANCE(5); if (('\t' <= lookahead && lookahead <= '\r') || lookahead == ' ') SKIP(2); - if (('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(14); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(27); END_STATE(); case 3: - ACCEPT_TOKEN(ts_builtin_sym_end); + if (eof) ADVANCE(4); + if (lookahead == '#') ADVANCE(6); + if (lookahead == '.') ADVANCE(24); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') SKIP(3); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(25); + if (('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(15); END_STATE(); case 4: - ACCEPT_TOKEN(anon_sym_EQ); + ACCEPT_TOKEN(ts_builtin_sym_end); END_STATE(); case 5: - ACCEPT_TOKEN(anon_sym_POUND); + ACCEPT_TOKEN(anon_sym_EQ); END_STATE(); case 6: - ACCEPT_TOKEN(aux_sym_comment_token1); - if (lookahead == '\t' || - (0x0b <= lookahead && lookahead <= '\r') || - lookahead == ' ') ADVANCE(6); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead)) ADVANCE(7); + ACCEPT_TOKEN(anon_sym_POUND); END_STATE(); case 7: ACCEPT_TOKEN(aux_sym_comment_token1); + if (lookahead == '\t' || + (0x0b <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(7); if (lookahead != 0 && - lookahead != '\n') ADVANCE(7); + (lookahead < '\t' || '\r' < lookahead)) ADVANCE(8); END_STATE(); case 8: - ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'a') ADVANCE(10); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'Z') || - lookahead == '_' || - ('b' <= lookahead && lookahead <= 'z')) ADVANCE(14); + ACCEPT_TOKEN(aux_sym_comment_token1); + if (lookahead != 0 && + lookahead != '\n') ADVANCE(8); END_STATE(); case 9: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'e') ADVANCE(14); + if (lookahead == 'a') ADVANCE(11); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(14); + ('b' <= lookahead && lookahead <= 'z')) ADVANCE(15); END_STATE(); case 10: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'l') ADVANCE(12); + if (lookahead == 'e') ADVANCE(15); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(14); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(15); END_STATE(); case 11: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'r') ADVANCE(13); + if (lookahead == 'l') ADVANCE(13); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(14); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(15); END_STATE(); case 12: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 's') ADVANCE(9); + if (lookahead == 'r') ADVANCE(14); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(14); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(15); END_STATE(); case 13: ACCEPT_TOKEN(sym_identifier); - if (lookahead == 'u') ADVANCE(9); + if (lookahead == 's') ADVANCE(10); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(14); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(15); END_STATE(); case 14: + ACCEPT_TOKEN(sym_identifier); + if (lookahead == 'u') ADVANCE(10); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'Z') || + lookahead == '_' || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(15); + END_STATE(); + case 15: ACCEPT_TOKEN(sym_identifier); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || - ('a' <= lookahead && lookahead <= 'z')) ADVANCE(14); - END_STATE(); - case 15: - ACCEPT_TOKEN(anon_sym_SQUOTE); + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(15); END_STATE(); case 16: - ACCEPT_TOKEN(anon_sym_DQUOTE); + ACCEPT_TOKEN(anon_sym_SQUOTE); END_STATE(); case 17: - ACCEPT_TOKEN(sym_string_content); - if (('\t' <= lookahead && lookahead <= '\r') || - lookahead == ' ') ADVANCE(17); - if (lookahead != 0 && - lookahead != '\'') ADVANCE(18); + ACCEPT_TOKEN(anon_sym_DQUOTE); END_STATE(); case 18: ACCEPT_TOKEN(sym_string_content); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(18); if (lookahead != 0 && - lookahead != '\'') ADVANCE(18); + lookahead != '\'') ADVANCE(19); END_STATE(); case 19: - ACCEPT_TOKEN(sym_string_interpolation_content); - if (('\t' <= lookahead && lookahead <= '\r') || - lookahead == ' ') ADVANCE(19); + ACCEPT_TOKEN(sym_string_content); if (lookahead != 0 && - lookahead != '"') ADVANCE(20); + lookahead != '\'') ADVANCE(19); END_STATE(); case 20: ACCEPT_TOKEN(sym_string_interpolation_content); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(20); if (lookahead != 0 && - lookahead != '"') ADVANCE(20); + lookahead != '"') ADVANCE(21); END_STATE(); case 21: - ACCEPT_TOKEN(sym_integer); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(21); + ACCEPT_TOKEN(sym_string_interpolation_content); + if (lookahead != 0 && + lookahead != '"') ADVANCE(21); END_STATE(); case 22: - ACCEPT_TOKEN(sym_boolean); + ACCEPT_TOKEN(aux_sym_integer_token1); + if (lookahead == 'x') ADVANCE(26); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(23); END_STATE(); case 23: - ACCEPT_TOKEN(sym_value); - if (lookahead == 'a') ADVANCE(25); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '#' && - lookahead != '=') ADVANCE(30); + ACCEPT_TOKEN(aux_sym_integer_token1); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(23); END_STATE(); case 24: - ACCEPT_TOKEN(sym_value); - if (lookahead == 'e') ADVANCE(22); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '#' && - lookahead != '=') ADVANCE(30); + ACCEPT_TOKEN(anon_sym_DOT); END_STATE(); case 25: - ACCEPT_TOKEN(sym_value); - if (lookahead == 'l') ADVANCE(27); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '#' && - lookahead != '=') ADVANCE(30); + ACCEPT_TOKEN(aux_sym_float_token1); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(25); END_STATE(); case 26: - ACCEPT_TOKEN(sym_value); - if (lookahead == 'r') ADVANCE(28); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '#' && - lookahead != '=') ADVANCE(30); + ACCEPT_TOKEN(anon_sym_0x); END_STATE(); case 27: - ACCEPT_TOKEN(sym_value); - if (lookahead == 's') ADVANCE(24); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '#' && - lookahead != '=') ADVANCE(30); + ACCEPT_TOKEN(aux_sym_hexadecimal_token1); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(27); END_STATE(); case 28: - ACCEPT_TOKEN(sym_value); - if (lookahead == 'u') ADVANCE(24); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '#' && - lookahead != '=') ADVANCE(30); + ACCEPT_TOKEN(sym_boolean); END_STATE(); case 29: ACCEPT_TOKEN(sym_value); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(21); + if (lookahead == 'a') ADVANCE(31); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && lookahead != '#' && - lookahead != '=') ADVANCE(30); + lookahead != '=') ADVANCE(36); END_STATE(); case 30: + ACCEPT_TOKEN(sym_value); + if (lookahead == 'e') ADVANCE(28); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + lookahead != '#' && + lookahead != '=') ADVANCE(36); + END_STATE(); + case 31: + ACCEPT_TOKEN(sym_value); + if (lookahead == 'l') ADVANCE(33); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + lookahead != '#' && + lookahead != '=') ADVANCE(36); + END_STATE(); + case 32: + ACCEPT_TOKEN(sym_value); + if (lookahead == 'r') ADVANCE(34); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + lookahead != '#' && + lookahead != '=') ADVANCE(36); + END_STATE(); + case 33: + ACCEPT_TOKEN(sym_value); + if (lookahead == 's') ADVANCE(30); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + lookahead != '#' && + lookahead != '=') ADVANCE(36); + END_STATE(); + case 34: + ACCEPT_TOKEN(sym_value); + if (lookahead == 'u') ADVANCE(30); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + lookahead != '#' && + lookahead != '=') ADVANCE(36); + END_STATE(); + case 35: + ACCEPT_TOKEN(sym_value); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(23); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + lookahead != '#' && + lookahead != '=') ADVANCE(36); + END_STATE(); + case 36: ACCEPT_TOKEN(sym_value); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && lookahead != '#' && - lookahead != '=') ADVANCE(30); + lookahead != '=') ADVANCE(36); END_STATE(); default: return false; @@ -450,21 +546,27 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { static const TSLexMode ts_lex_modes[STATE_COUNT] = { [0] = {.lex_state = 0, .external_lex_state = 1}, - [1] = {.lex_state = 2}, + [1] = {.lex_state = 3}, [2] = {.lex_state = 1, .external_lex_state = 1}, - [3] = {.lex_state = 2}, - [4] = {.lex_state = 2}, - [5] = {.lex_state = 2}, - [6] = {.lex_state = 2}, - [7] = {.lex_state = 2}, - [8] = {.lex_state = 2}, - [9] = {.lex_state = 6}, - [10] = {.lex_state = 0}, - [11] = {.lex_state = 0}, - [12] = {.lex_state = 17}, - [13] = {.lex_state = 19}, - [14] = {.lex_state = 0}, + [3] = {.lex_state = 3}, + [4] = {.lex_state = 3}, + [5] = {.lex_state = 3}, + [6] = {.lex_state = 3}, + [7] = {.lex_state = 3}, + [8] = {.lex_state = 3}, + [9] = {.lex_state = 3}, + [10] = {.lex_state = 3}, + [11] = {.lex_state = 3}, + [12] = {.lex_state = 3}, + [13] = {.lex_state = 0}, + [14] = {.lex_state = 7}, [15] = {.lex_state = 0}, + [16] = {.lex_state = 18}, + [17] = {.lex_state = 20}, + [18] = {.lex_state = 0}, + [19] = {.lex_state = 3}, + [20] = {.lex_state = 2}, + [21] = {.lex_state = 0}, }; static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { @@ -475,13 +577,15 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_identifier] = ACTIONS(1), [anon_sym_SQUOTE] = ACTIONS(1), [anon_sym_DQUOTE] = ACTIONS(1), - [sym_integer] = ACTIONS(1), + [aux_sym_integer_token1] = ACTIONS(1), + [anon_sym_DOT] = ACTIONS(1), + [aux_sym_float_token1] = ACTIONS(1), [sym_boolean] = ACTIONS(1), [sym_value] = ACTIONS(1), [sym__empty_value] = ACTIONS(1), }, [1] = { - [sym_document] = STATE(11), + [sym_document] = STATE(15), [sym_assignment] = STATE(3), [sym_comment] = STATE(3), [aux_sym_document_repeat1] = STATE(3), @@ -492,128 +596,179 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { }; static const uint16_t ts_small_parse_table[] = { - [0] = 5, + [0] = 8, ACTIONS(9), 1, anon_sym_SQUOTE, ACTIONS(11), 1, anon_sym_DQUOTE, + ACTIONS(13), 1, + aux_sym_integer_token1, ACTIONS(15), 1, + anon_sym_0x, + ACTIONS(19), 1, sym_value, - ACTIONS(13), 3, + ACTIONS(17), 2, sym__empty_value, - sym_integer, sym_boolean, - STATE(6), 3, + STATE(9), 3, + sym_integer, + sym_float, + sym_hexadecimal, + STATE(8), 4, sym__value, sym_string, sym_string_interpolation, - [20] = 4, + sym_number, + [31] = 4, ACTIONS(5), 1, anon_sym_POUND, ACTIONS(7), 1, sym_identifier, - ACTIONS(17), 1, - ts_builtin_sym_end, - STATE(4), 3, - sym_assignment, - sym_comment, - aux_sym_document_repeat1, - [35] = 4, - ACTIONS(19), 1, - ts_builtin_sym_end, ACTIONS(21), 1, + ts_builtin_sym_end, + STATE(4), 3, + sym_assignment, + sym_comment, + aux_sym_document_repeat1, + [46] = 4, + ACTIONS(23), 1, + ts_builtin_sym_end, + ACTIONS(25), 1, anon_sym_POUND, - ACTIONS(24), 1, + ACTIONS(28), 1, sym_identifier, STATE(4), 3, sym_assignment, sym_comment, aux_sym_document_repeat1, - [50] = 1, - ACTIONS(27), 3, - ts_builtin_sym_end, - anon_sym_POUND, - sym_identifier, - [56] = 1, - ACTIONS(29), 3, - ts_builtin_sym_end, - anon_sym_POUND, - sym_identifier, - [62] = 1, + [61] = 2, + ACTIONS(33), 1, + anon_sym_DOT, ACTIONS(31), 3, ts_builtin_sym_end, anon_sym_POUND, sym_identifier, - [68] = 1, - ACTIONS(33), 3, + [70] = 1, + ACTIONS(35), 3, ts_builtin_sym_end, anon_sym_POUND, sym_identifier, - [74] = 1, - ACTIONS(35), 1, - aux_sym_comment_token1, - [78] = 1, - ACTIONS(37), 1, - anon_sym_EQ, - [82] = 1, - ACTIONS(39), 1, + [76] = 1, + ACTIONS(37), 3, ts_builtin_sym_end, - [86] = 1, - ACTIONS(41), 1, - sym_string_content, - [90] = 1, - ACTIONS(43), 1, - sym_string_interpolation_content, + anon_sym_POUND, + sym_identifier, + [82] = 1, + ACTIONS(39), 3, + ts_builtin_sym_end, + anon_sym_POUND, + sym_identifier, + [88] = 1, + ACTIONS(41), 3, + ts_builtin_sym_end, + anon_sym_POUND, + sym_identifier, [94] = 1, - ACTIONS(45), 1, - anon_sym_SQUOTE, - [98] = 1, - ACTIONS(47), 1, + ACTIONS(43), 3, + ts_builtin_sym_end, + anon_sym_POUND, + sym_identifier, + [100] = 1, + ACTIONS(45), 3, + ts_builtin_sym_end, + anon_sym_POUND, + sym_identifier, + [106] = 1, + ACTIONS(47), 3, + ts_builtin_sym_end, + anon_sym_POUND, + sym_identifier, + [112] = 1, + ACTIONS(49), 1, + anon_sym_EQ, + [116] = 1, + ACTIONS(51), 1, + aux_sym_comment_token1, + [120] = 1, + ACTIONS(53), 1, + ts_builtin_sym_end, + [124] = 1, + ACTIONS(55), 1, + sym_string_content, + [128] = 1, + ACTIONS(57), 1, + sym_string_interpolation_content, + [132] = 1, + ACTIONS(59), 1, anon_sym_DQUOTE, + [136] = 1, + ACTIONS(61), 1, + aux_sym_float_token1, + [140] = 1, + ACTIONS(63), 1, + aux_sym_hexadecimal_token1, + [144] = 1, + ACTIONS(65), 1, + anon_sym_SQUOTE, }; static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(2)] = 0, - [SMALL_STATE(3)] = 20, - [SMALL_STATE(4)] = 35, - [SMALL_STATE(5)] = 50, - [SMALL_STATE(6)] = 56, - [SMALL_STATE(7)] = 62, - [SMALL_STATE(8)] = 68, - [SMALL_STATE(9)] = 74, - [SMALL_STATE(10)] = 78, - [SMALL_STATE(11)] = 82, - [SMALL_STATE(12)] = 86, - [SMALL_STATE(13)] = 90, - [SMALL_STATE(14)] = 94, - [SMALL_STATE(15)] = 98, + [SMALL_STATE(3)] = 31, + [SMALL_STATE(4)] = 46, + [SMALL_STATE(5)] = 61, + [SMALL_STATE(6)] = 70, + [SMALL_STATE(7)] = 76, + [SMALL_STATE(8)] = 82, + [SMALL_STATE(9)] = 88, + [SMALL_STATE(10)] = 94, + [SMALL_STATE(11)] = 100, + [SMALL_STATE(12)] = 106, + [SMALL_STATE(13)] = 112, + [SMALL_STATE(14)] = 116, + [SMALL_STATE(15)] = 120, + [SMALL_STATE(16)] = 124, + [SMALL_STATE(17)] = 128, + [SMALL_STATE(18)] = 132, + [SMALL_STATE(19)] = 136, + [SMALL_STATE(20)] = 140, + [SMALL_STATE(21)] = 144, }; static const TSParseActionEntry ts_parse_actions[] = { [0] = {.entry = {.count = 0, .reusable = false}}, [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), [3] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_document, 0, 0, 0), - [5] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), - [7] = {.entry = {.count = 1, .reusable = true}}, SHIFT(10), - [9] = {.entry = {.count = 1, .reusable = true}}, SHIFT(12), - [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), - [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), - [15] = {.entry = {.count = 1, .reusable = false}}, SHIFT(6), - [17] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_document, 1, 0, 0), - [19] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), - [21] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(9), - [24] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(10), - [27] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_comment, 2, 0, 0), - [29] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_assignment, 3, 0, 1), - [31] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_string, 3, 0, 0), - [33] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_string_interpolation, 3, 0, 0), - [35] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), - [37] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), - [39] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), - [41] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), - [43] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), - [45] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), - [47] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), + [5] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), + [7] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), + [9] = {.entry = {.count = 1, .reusable = true}}, SHIFT(16), + [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), + [13] = {.entry = {.count = 1, .reusable = false}}, SHIFT(5), + [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(20), + [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), + [19] = {.entry = {.count = 1, .reusable = false}}, SHIFT(8), + [21] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_document, 1, 0, 0), + [23] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), + [25] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(14), + [28] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(13), + [31] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_integer, 1, 0, 0), + [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), + [35] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_comment, 2, 0, 0), + [37] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_hexadecimal, 2, 0, 0), + [39] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_assignment, 3, 0, 1), + [41] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_number, 1, 0, 0), + [43] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_string, 3, 0, 0), + [45] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_string_interpolation, 3, 0, 0), + [47] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_float, 3, 0, 0), + [49] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), + [51] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), + [53] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), + [55] = {.entry = {.count = 1, .reusable = true}}, SHIFT(21), + [57] = {.entry = {.count = 1, .reusable = true}}, SHIFT(18), + [59] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), + [61] = {.entry = {.count = 1, .reusable = true}}, SHIFT(12), + [63] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), + [65] = {.entry = {.count = 1, .reusable = true}}, SHIFT(10), }; enum ts_external_scanner_symbol_identifiers { diff --git a/test/corpus/values.txt b/test/corpus/values.txt index 194041d..1e9f22d 100644 --- a/test/corpus/values.txt +++ b/test/corpus/values.txt @@ -5,6 +5,11 @@ values INTEGER_VALUE = 1234 NEGATIVE_INTEGER_VALUE = -1234 +FLOAT = 1234.23 +FLOAT = -1234.23 + +HEX = 0xff00ff + BOOL_VALUE = true BOOL_VALUE = false @@ -13,10 +18,24 @@ BOOL_VALUE = false (document (assignment key: (identifier) - value: (integer)) + value: (number + (integer))) (assignment key: (identifier) - value: (integer)) + value: (number + (integer))) + (assignment + key: (identifier) + value: (number + (float))) + (assignment + key: (identifier) + value: (number + (float))) + (assignment + key: (identifier) + value: (number + (hexadecimal))) (assignment key: (identifier) value: (boolean))