diff --git a/grammar.js b/grammar.js index 360ab7d..70a9844 100644 --- a/grammar.js +++ b/grammar.js @@ -28,11 +28,16 @@ module.exports = grammar({ comment: _ => /\#[^\n]*/, identifier: _ => /[A-Za-z_][A-Za-z0-9_]*/, + variable: $ => seq('$', choice( + $.identifier, + seq('{', $.identifier, '}') + )), _value: $ => choice( $.string, $.number, $.boolean, + $.variable, $.value, ), @@ -51,7 +56,10 @@ module.exports = grammar({ _string: $ => seq( '"', - optional(alias(/[^"]+/, $.string_content)), + optional(repeat(choice( + alias(/[^"\$]+/, $.string_content), + $.variable + ))), '"', ), @@ -73,6 +81,6 @@ module.exports = grammar({ boolean: _ => token(choice('true', 'false')), - value: _ => /[^\#\s\"\']+/, + value: _ => /[^\#\s\"\'\$]+/, }, }); diff --git a/src/grammar.json b/src/grammar.json index 377156b..21d87e9 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -62,6 +62,41 @@ "type": "PATTERN", "value": "[A-Za-z_][A-Za-z0-9_]*" }, + "variable": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "$" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "identifier" + }, + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "SYMBOL", + "name": "identifier" + }, + { + "type": "STRING", + "value": "}" + } + ] + } + ] + } + ] + }, "_value": { "type": "CHOICE", "members": [ @@ -77,6 +112,10 @@ "type": "SYMBOL", "name": "boolean" }, + { + "type": "SYMBOL", + "name": "variable" + }, { "type": "SYMBOL", "name": "value" @@ -137,13 +176,25 @@ "type": "CHOICE", "members": [ { - "type": "ALIAS", + "type": "REPEAT", "content": { - "type": "PATTERN", - "value": "[^\"]+" - }, - "named": true, - "value": "string_content" + "type": "CHOICE", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "PATTERN", + "value": "[^\"\\$]+" + }, + "named": true, + "value": "string_content" + }, + { + "type": "SYMBOL", + "name": "variable" + } + ] + } }, { "type": "BLANK" @@ -224,7 +275,7 @@ }, "value": { "type": "PATTERN", - "value": "[^\\#\\s\\\"\\']+" + "value": "[^\\#\\s\\\"\\'\\$]+" } }, "extras": [ diff --git a/src/node-types.json b/src/node-types.json index 1813de3..4d57c9d 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -32,6 +32,10 @@ { "type": "value", "named": true + }, + { + "type": "variable", + "named": true } ] } @@ -99,12 +103,31 @@ "named": true, "fields": {}, "children": { - "multiple": false, + "multiple": true, "required": false, "types": [ { "type": "string_content", "named": true + }, + { + "type": "variable", + "named": true + } + ] + } + }, + { + "type": "variable", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "identifier", + "named": true } ] } @@ -113,6 +136,10 @@ "type": "\"", "named": false }, + { + "type": "$", + "named": false + }, { "type": "'", "named": false @@ -152,5 +179,13 @@ { "type": "value", "named": true + }, + { + "type": "{", + "named": false + }, + { + "type": "}", + "named": false } ] \ No newline at end of file diff --git a/src/parser.c b/src/parser.c index d1192fd..5401092 100644 --- a/src/parser.c +++ b/src/parser.c @@ -5,11 +5,11 @@ #endif #define LANGUAGE_VERSION 14 -#define STATE_COUNT 21 +#define STATE_COUNT 32 #define LARGE_STATE_COUNT 3 -#define SYMBOL_COUNT 23 +#define SYMBOL_COUNT 28 #define ALIAS_COUNT 0 -#define TOKEN_COUNT 14 +#define TOKEN_COUNT 17 #define EXTERNAL_TOKEN_COUNT 1 #define FIELD_COUNT 2 #define MAX_ALIAS_SEQUENCE_LENGTH 4 @@ -19,25 +19,30 @@ enum ts_symbol_identifiers { anon_sym_EQ = 1, sym_comment = 2, sym_identifier = 3, - anon_sym_SQUOTE = 4, - aux_sym__literal_string_token1 = 5, - anon_sym_DQUOTE = 6, - aux_sym__string_token1 = 7, - sym_decimal = 8, - sym_hexadecimal = 9, - sym_float = 10, - sym_boolean = 11, - sym_value = 12, - sym__end_of_assignment = 13, - sym_document = 14, - sym_assignment = 15, - sym__value = 16, - sym_string = 17, - sym__literal_string = 18, - sym__string = 19, - sym_number = 20, - sym_integer = 21, - aux_sym_document_repeat1 = 22, + anon_sym_DOLLAR = 4, + anon_sym_LBRACE = 5, + anon_sym_RBRACE = 6, + anon_sym_SQUOTE = 7, + aux_sym__literal_string_token1 = 8, + anon_sym_DQUOTE = 9, + aux_sym__string_token1 = 10, + sym_decimal = 11, + sym_hexadecimal = 12, + sym_float = 13, + sym_boolean = 14, + sym_value = 15, + sym__end_of_assignment = 16, + sym_document = 17, + sym_assignment = 18, + sym_variable = 19, + sym__value = 20, + sym_string = 21, + sym__literal_string = 22, + sym__string = 23, + sym_number = 24, + sym_integer = 25, + aux_sym_document_repeat1 = 26, + aux_sym__string_repeat1 = 27, }; static const char * const ts_symbol_names[] = { @@ -45,6 +50,9 @@ static const char * const ts_symbol_names[] = { [anon_sym_EQ] = "=", [sym_comment] = "comment", [sym_identifier] = "identifier", + [anon_sym_DOLLAR] = "$", + [anon_sym_LBRACE] = "{", + [anon_sym_RBRACE] = "}", [anon_sym_SQUOTE] = "'", [aux_sym__literal_string_token1] = "string_content", [anon_sym_DQUOTE] = "\"", @@ -57,6 +65,7 @@ static const char * const ts_symbol_names[] = { [sym__end_of_assignment] = "_end_of_assignment", [sym_document] = "document", [sym_assignment] = "assignment", + [sym_variable] = "variable", [sym__value] = "_value", [sym_string] = "string", [sym__literal_string] = "_literal_string", @@ -64,6 +73,7 @@ static const char * const ts_symbol_names[] = { [sym_number] = "number", [sym_integer] = "integer", [aux_sym_document_repeat1] = "document_repeat1", + [aux_sym__string_repeat1] = "_string_repeat1", }; static const TSSymbol ts_symbol_map[] = { @@ -71,6 +81,9 @@ static const TSSymbol ts_symbol_map[] = { [anon_sym_EQ] = anon_sym_EQ, [sym_comment] = sym_comment, [sym_identifier] = sym_identifier, + [anon_sym_DOLLAR] = anon_sym_DOLLAR, + [anon_sym_LBRACE] = anon_sym_LBRACE, + [anon_sym_RBRACE] = anon_sym_RBRACE, [anon_sym_SQUOTE] = anon_sym_SQUOTE, [aux_sym__literal_string_token1] = aux_sym__literal_string_token1, [anon_sym_DQUOTE] = anon_sym_DQUOTE, @@ -83,6 +96,7 @@ static const TSSymbol ts_symbol_map[] = { [sym__end_of_assignment] = sym__end_of_assignment, [sym_document] = sym_document, [sym_assignment] = sym_assignment, + [sym_variable] = sym_variable, [sym__value] = sym__value, [sym_string] = sym_string, [sym__literal_string] = sym__literal_string, @@ -90,6 +104,7 @@ static const TSSymbol ts_symbol_map[] = { [sym_number] = sym_number, [sym_integer] = sym_integer, [aux_sym_document_repeat1] = aux_sym_document_repeat1, + [aux_sym__string_repeat1] = aux_sym__string_repeat1, }; static const TSSymbolMetadata ts_symbol_metadata[] = { @@ -109,6 +124,18 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, + [anon_sym_DOLLAR] = { + .visible = true, + .named = false, + }, + [anon_sym_LBRACE] = { + .visible = true, + .named = false, + }, + [anon_sym_RBRACE] = { + .visible = true, + .named = false, + }, [anon_sym_SQUOTE] = { .visible = true, .named = false, @@ -157,6 +184,10 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, + [sym_variable] = { + .visible = true, + .named = true, + }, [sym__value] = { .visible = false, .named = true, @@ -185,6 +216,10 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = false, .named = false, }, + [aux_sym__string_repeat1] = { + .visible = false, + .named = false, + }, }; enum ts_field_identifiers { @@ -234,13 +269,24 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [11] = 11, [12] = 12, [13] = 13, - [14] = 14, + [14] = 13, [15] = 15, [16] = 16, [17] = 17, [18] = 18, [19] = 19, [20] = 20, + [21] = 10, + [22] = 22, + [23] = 23, + [24] = 24, + [25] = 25, + [26] = 26, + [27] = 11, + [28] = 28, + [29] = 29, + [30] = 23, + [31] = 29, }; static bool ts_lex(TSLexer *lexer, TSStateId state) { @@ -250,66 +296,71 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { case 0: if (eof) ADVANCE(9); ADVANCE_MAP( - '"', 22, + '"', 25, '#', 11, - '\'', 19, + '$', 19, + '\'', 22, '-', 5, '0', 4, '=', 10, 'f', 12, 't', 15, + '{', 20, + '}', 21, ); if (('\t' <= lookahead && lookahead <= '\r') || lookahead == ' ') SKIP(0); - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(25); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(28); if (('A' <= lookahead && lookahead <= 'Z') || lookahead == '_' || ('a' <= lookahead && lookahead <= 'z')) ADVANCE(18); END_STATE(); case 1: - if (lookahead == '"') ADVANCE(22); - if (lookahead == '\'') ADVANCE(19); - if (lookahead == '-') ADVANCE(39); - if (lookahead == '0') ADVANCE(38); - if (lookahead == 'f') ADVANCE(32); - if (lookahead == 't') ADVANCE(35); + if (lookahead == '"') ADVANCE(25); + if (lookahead == '$') ADVANCE(19); + if (lookahead == '\'') ADVANCE(22); + if (lookahead == '-') ADVANCE(42); + if (lookahead == '0') ADVANCE(41); + if (lookahead == 'f') ADVANCE(35); + if (lookahead == 't') ADVANCE(38); if (('\t' <= lookahead && lookahead <= '\r') || lookahead == ' ') SKIP(1); - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(26); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(29); if (lookahead != 0 && - lookahead != '"' && - lookahead != '#') ADVANCE(42); + (lookahead < '"' || '$' < lookahead)) ADVANCE(45); END_STATE(); case 2: - if (lookahead == '"') ADVANCE(22); + if (lookahead == '"') ADVANCE(25); + if (lookahead == '$') ADVANCE(19); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(26); + if (lookahead != 0) ADVANCE(27); + END_STATE(); + case 3: + if (lookahead == '\'') ADVANCE(22); if (('\t' <= lookahead && lookahead <= '\r') || lookahead == ' ') ADVANCE(23); if (lookahead != 0) ADVANCE(24); END_STATE(); - case 3: - if (lookahead == '\'') ADVANCE(19); - if (('\t' <= lookahead && lookahead <= '\r') || - lookahead == ' ') ADVANCE(20); - if (lookahead != 0) ADVANCE(21); - END_STATE(); case 4: if (lookahead == 'X' || lookahead == 'x') ADVANCE(7); END_STATE(); case 5: - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(25); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(28); END_STATE(); case 6: - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(29); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(32); END_STATE(); case 7: if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'F') || - ('a' <= lookahead && lookahead <= 'f')) ADVANCE(27); + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(30); END_STATE(); case 8: if (eof) ADVANCE(9); if (lookahead == '#') ADVANCE(11); + if (lookahead == '{') ADVANCE(20); if (('\t' <= lookahead && lookahead <= '\r') || lookahead == ' ') SKIP(8); if (('A' <= lookahead && lookahead <= 'Z') || @@ -383,203 +434,199 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { ('a' <= lookahead && lookahead <= 'z')) ADVANCE(18); END_STATE(); case 19: - ACCEPT_TOKEN(anon_sym_SQUOTE); + ACCEPT_TOKEN(anon_sym_DOLLAR); END_STATE(); case 20: - ACCEPT_TOKEN(aux_sym__literal_string_token1); - if (('\t' <= lookahead && lookahead <= '\r') || - lookahead == ' ') ADVANCE(20); - if (lookahead != 0 && - lookahead != '\'') ADVANCE(21); + ACCEPT_TOKEN(anon_sym_LBRACE); END_STATE(); case 21: - ACCEPT_TOKEN(aux_sym__literal_string_token1); - if (lookahead != 0 && - lookahead != '\'') ADVANCE(21); + ACCEPT_TOKEN(anon_sym_RBRACE); END_STATE(); case 22: - ACCEPT_TOKEN(anon_sym_DQUOTE); + ACCEPT_TOKEN(anon_sym_SQUOTE); END_STATE(); case 23: - ACCEPT_TOKEN(aux_sym__string_token1); + ACCEPT_TOKEN(aux_sym__literal_string_token1); if (('\t' <= lookahead && lookahead <= '\r') || lookahead == ' ') ADVANCE(23); if (lookahead != 0 && - lookahead != '"') ADVANCE(24); + lookahead != '\'') ADVANCE(24); END_STATE(); case 24: - ACCEPT_TOKEN(aux_sym__string_token1); + ACCEPT_TOKEN(aux_sym__literal_string_token1); if (lookahead != 0 && - lookahead != '"') ADVANCE(24); + lookahead != '\'') ADVANCE(24); END_STATE(); case 25: - ACCEPT_TOKEN(sym_decimal); - if (lookahead == '.') ADVANCE(6); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(25); + ACCEPT_TOKEN(anon_sym_DQUOTE); END_STATE(); case 26: - ACCEPT_TOKEN(sym_decimal); - if (lookahead == '.') ADVANCE(40); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(26); + ACCEPT_TOKEN(aux_sym__string_token1); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(26); if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + lookahead != '$') ADVANCE(27); END_STATE(); case 27: - ACCEPT_TOKEN(sym_hexadecimal); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'F') || - ('a' <= lookahead && lookahead <= 'f')) ADVANCE(27); + ACCEPT_TOKEN(aux_sym__string_token1); + if (lookahead != 0 && + lookahead != '"' && + lookahead != '$') ADVANCE(27); END_STATE(); case 28: + ACCEPT_TOKEN(sym_decimal); + if (lookahead == '.') ADVANCE(6); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(28); + END_STATE(); + case 29: + ACCEPT_TOKEN(sym_decimal); + if (lookahead == '.') ADVANCE(43); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(29); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); + END_STATE(); + case 30: ACCEPT_TOKEN(sym_hexadecimal); if (('0' <= lookahead && lookahead <= '9') || ('A' <= lookahead && lookahead <= 'F') || - ('a' <= lookahead && lookahead <= 'f')) ADVANCE(28); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); - END_STATE(); - case 29: - ACCEPT_TOKEN(sym_float); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(29); - END_STATE(); - case 30: - ACCEPT_TOKEN(sym_float); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(30); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(30); END_STATE(); case 31: + ACCEPT_TOKEN(sym_hexadecimal); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(31); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); + END_STATE(); + case 32: + ACCEPT_TOKEN(sym_float); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(32); + END_STATE(); + case 33: + ACCEPT_TOKEN(sym_float); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(33); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); + END_STATE(); + case 34: ACCEPT_TOKEN(sym_boolean); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); - END_STATE(); - case 32: - ACCEPT_TOKEN(sym_value); - if (lookahead == 'a') ADVANCE(34); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); - END_STATE(); - case 33: - ACCEPT_TOKEN(sym_value); - if (lookahead == 'e') ADVANCE(31); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); - END_STATE(); - case 34: - ACCEPT_TOKEN(sym_value); - if (lookahead == 'l') ADVANCE(36); - if (lookahead != 0 && - (lookahead < '\t' || '\r' < lookahead) && - lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); END_STATE(); case 35: ACCEPT_TOKEN(sym_value); - if (lookahead == 'r') ADVANCE(37); + if (lookahead == 'a') ADVANCE(37); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); END_STATE(); case 36: ACCEPT_TOKEN(sym_value); - if (lookahead == 's') ADVANCE(33); + if (lookahead == 'e') ADVANCE(34); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); END_STATE(); case 37: ACCEPT_TOKEN(sym_value); - if (lookahead == 'u') ADVANCE(33); + if (lookahead == 'l') ADVANCE(39); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); END_STATE(); case 38: ACCEPT_TOKEN(sym_value); - if (lookahead == 'X' || - lookahead == 'x') ADVANCE(41); + if (lookahead == 'r') ADVANCE(40); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); END_STATE(); case 39: ACCEPT_TOKEN(sym_value); - if (('1' <= lookahead && lookahead <= '9')) ADVANCE(26); + if (lookahead == 's') ADVANCE(36); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); END_STATE(); case 40: ACCEPT_TOKEN(sym_value); - if (('0' <= lookahead && lookahead <= '9')) ADVANCE(30); + if (lookahead == 'u') ADVANCE(36); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); END_STATE(); case 41: ACCEPT_TOKEN(sym_value); - if (('0' <= lookahead && lookahead <= '9') || - ('A' <= lookahead && lookahead <= 'F') || - ('a' <= lookahead && lookahead <= 'f')) ADVANCE(28); + if (lookahead == 'X' || + lookahead == 'x') ADVANCE(44); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); END_STATE(); case 42: + ACCEPT_TOKEN(sym_value); + if (('1' <= lookahead && lookahead <= '9')) ADVANCE(29); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); + END_STATE(); + case 43: + ACCEPT_TOKEN(sym_value); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(33); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); + END_STATE(); + case 44: + ACCEPT_TOKEN(sym_value); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(31); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); + END_STATE(); + case 45: ACCEPT_TOKEN(sym_value); if (lookahead != 0 && (lookahead < '\t' || '\r' < lookahead) && lookahead != ' ' && - lookahead != '"' && - lookahead != '#' && - lookahead != '\'') ADVANCE(42); + (lookahead < '"' || '$' < lookahead) && + lookahead != '\'') ADVANCE(45); END_STATE(); default: return false; @@ -592,22 +639,33 @@ static const TSLexMode ts_lex_modes[STATE_COUNT] = { [2] = {.lex_state = 1, .external_lex_state = 1}, [3] = {.lex_state = 8}, [4] = {.lex_state = 8}, - [5] = {.lex_state = 8}, - [6] = {.lex_state = 8}, - [7] = {.lex_state = 3}, - [8] = {.lex_state = 2}, - [9] = {.lex_state = 0}, - [10] = {.lex_state = 0}, - [11] = {.lex_state = 0, .external_lex_state = 1}, - [12] = {.lex_state = 0, .external_lex_state = 1}, - [13] = {.lex_state = 0, .external_lex_state = 1}, - [14] = {.lex_state = 0, .external_lex_state = 1}, + [5] = {.lex_state = 2}, + [6] = {.lex_state = 2}, + [7] = {.lex_state = 2}, + [8] = {.lex_state = 8}, + [9] = {.lex_state = 8}, + [10] = {.lex_state = 2}, + [11] = {.lex_state = 2}, + [12] = {.lex_state = 3}, + [13] = {.lex_state = 8}, + [14] = {.lex_state = 8}, [15] = {.lex_state = 0}, - [16] = {.lex_state = 0, .external_lex_state = 1}, - [17] = {.lex_state = 0}, + [16] = {.lex_state = 0}, + [17] = {.lex_state = 0, .external_lex_state = 1}, [18] = {.lex_state = 0, .external_lex_state = 1}, [19] = {.lex_state = 0, .external_lex_state = 1}, [20] = {.lex_state = 0, .external_lex_state = 1}, + [21] = {.lex_state = 0, .external_lex_state = 1}, + [22] = {.lex_state = 0, .external_lex_state = 1}, + [23] = {.lex_state = 0}, + [24] = {.lex_state = 0, .external_lex_state = 1}, + [25] = {.lex_state = 0, .external_lex_state = 1}, + [26] = {.lex_state = 0}, + [27] = {.lex_state = 0, .external_lex_state = 1}, + [28] = {.lex_state = 0, .external_lex_state = 1}, + [29] = {.lex_state = 8}, + [30] = {.lex_state = 0}, + [31] = {.lex_state = 8}, }; static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { @@ -616,6 +674,9 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [anon_sym_EQ] = ACTIONS(1), [sym_comment] = ACTIONS(1), [sym_identifier] = ACTIONS(1), + [anon_sym_DOLLAR] = ACTIONS(1), + [anon_sym_LBRACE] = ACTIONS(1), + [anon_sym_RBRACE] = ACTIONS(1), [anon_sym_SQUOTE] = ACTIONS(1), [anon_sym_DQUOTE] = ACTIONS(1), [sym_decimal] = ACTIONS(1), @@ -625,7 +686,7 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym__end_of_assignment] = ACTIONS(1), }, [1] = { - [sym_document] = STATE(10), + [sym_document] = STATE(15), [sym_assignment] = STATE(4), [aux_sym_document_repeat1] = STATE(4), [ts_builtin_sym_end] = ACTIONS(3), @@ -633,30 +694,32 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_identifier] = ACTIONS(7), }, [2] = { - [sym__value] = STATE(14), - [sym_string] = STATE(14), - [sym__literal_string] = STATE(13), - [sym__string] = STATE(13), - [sym_number] = STATE(14), - [sym_integer] = STATE(11), - [anon_sym_SQUOTE] = ACTIONS(9), - [anon_sym_DQUOTE] = ACTIONS(11), - [sym_decimal] = ACTIONS(13), - [sym_hexadecimal] = ACTIONS(13), - [sym_float] = ACTIONS(15), - [sym_boolean] = ACTIONS(17), - [sym_value] = ACTIONS(17), - [sym__end_of_assignment] = ACTIONS(19), + [sym_variable] = STATE(19), + [sym__value] = STATE(19), + [sym_string] = STATE(19), + [sym__literal_string] = STATE(20), + [sym__string] = STATE(20), + [sym_number] = STATE(19), + [sym_integer] = STATE(18), + [anon_sym_DOLLAR] = ACTIONS(9), + [anon_sym_SQUOTE] = ACTIONS(11), + [anon_sym_DQUOTE] = ACTIONS(13), + [sym_decimal] = ACTIONS(15), + [sym_hexadecimal] = ACTIONS(15), + [sym_float] = ACTIONS(17), + [sym_boolean] = ACTIONS(19), + [sym_value] = ACTIONS(19), + [sym__end_of_assignment] = ACTIONS(21), }, }; static const uint16_t ts_small_parse_table[] = { [0] = 4, - ACTIONS(21), 1, - ts_builtin_sym_end, ACTIONS(23), 1, + ts_builtin_sym_end, + ACTIONS(25), 1, sym_comment, - ACTIONS(26), 1, + ACTIONS(28), 1, sym_identifier, STATE(3), 2, sym_assignment, @@ -664,90 +727,163 @@ static const uint16_t ts_small_parse_table[] = { [14] = 4, ACTIONS(7), 1, sym_identifier, - ACTIONS(29), 1, - ts_builtin_sym_end, ACTIONS(31), 1, + ts_builtin_sym_end, + ACTIONS(33), 1, sym_comment, STATE(3), 2, sym_assignment, aux_sym_document_repeat1, - [28] = 1, - ACTIONS(33), 3, - ts_builtin_sym_end, - sym_comment, - sym_identifier, - [34] = 1, - ACTIONS(35), 3, - ts_builtin_sym_end, - sym_comment, - sym_identifier, - [40] = 2, + [28] = 4, + ACTIONS(35), 1, + anon_sym_DOLLAR, ACTIONS(37), 1, - anon_sym_SQUOTE, + anon_sym_DQUOTE, ACTIONS(39), 1, - aux_sym__literal_string_token1, - [47] = 2, + aux_sym__string_token1, + STATE(6), 2, + sym_variable, + aux_sym__string_repeat1, + [42] = 4, + ACTIONS(35), 1, + anon_sym_DOLLAR, ACTIONS(41), 1, anon_sym_DQUOTE, ACTIONS(43), 1, aux_sym__string_token1, - [54] = 1, + STATE(7), 2, + sym_variable, + aux_sym__string_repeat1, + [56] = 4, ACTIONS(45), 1, - anon_sym_EQ, - [58] = 1, - ACTIONS(47), 1, - ts_builtin_sym_end, - [62] = 1, - ACTIONS(49), 1, - sym__end_of_assignment, - [66] = 1, - ACTIONS(51), 1, - sym__end_of_assignment, + anon_sym_DOLLAR, + ACTIONS(48), 1, + anon_sym_DQUOTE, + ACTIONS(50), 1, + aux_sym__string_token1, + STATE(7), 2, + sym_variable, + aux_sym__string_repeat1, [70] = 1, - ACTIONS(53), 1, - sym__end_of_assignment, - [74] = 1, - ACTIONS(55), 1, - sym__end_of_assignment, - [78] = 1, - ACTIONS(57), 1, + ACTIONS(53), 3, + ts_builtin_sym_end, + sym_comment, + sym_identifier, + [76] = 1, + ACTIONS(55), 3, + ts_builtin_sym_end, + sym_comment, + sym_identifier, + [82] = 2, + ACTIONS(59), 1, + aux_sym__string_token1, + ACTIONS(57), 2, + anon_sym_DOLLAR, + anon_sym_DQUOTE, + [90] = 2, + ACTIONS(63), 1, + aux_sym__string_token1, + ACTIONS(61), 2, + anon_sym_DOLLAR, + anon_sym_DQUOTE, + [98] = 2, + ACTIONS(65), 1, anon_sym_SQUOTE, - [82] = 1, + ACTIONS(67), 1, + aux_sym__literal_string_token1, + [105] = 2, + ACTIONS(69), 1, + sym_identifier, + ACTIONS(71), 1, + anon_sym_LBRACE, + [112] = 2, + ACTIONS(73), 1, + sym_identifier, + ACTIONS(75), 1, + anon_sym_LBRACE, + [119] = 1, + ACTIONS(77), 1, + ts_builtin_sym_end, + [123] = 1, + ACTIONS(79), 1, + anon_sym_EQ, + [127] = 1, + ACTIONS(81), 1, + sym__end_of_assignment, + [131] = 1, + ACTIONS(83), 1, + sym__end_of_assignment, + [135] = 1, + ACTIONS(85), 1, + sym__end_of_assignment, + [139] = 1, + ACTIONS(87), 1, + sym__end_of_assignment, + [143] = 1, ACTIONS(59), 1, sym__end_of_assignment, - [86] = 1, - ACTIONS(61), 1, - anon_sym_DQUOTE, - [90] = 1, + [147] = 1, + ACTIONS(89), 1, + sym__end_of_assignment, + [151] = 1, + ACTIONS(91), 1, + anon_sym_RBRACE, + [155] = 1, + ACTIONS(93), 1, + sym__end_of_assignment, + [159] = 1, + ACTIONS(95), 1, + sym__end_of_assignment, + [163] = 1, + ACTIONS(97), 1, + anon_sym_SQUOTE, + [167] = 1, ACTIONS(63), 1, sym__end_of_assignment, - [94] = 1, - ACTIONS(65), 1, - sym__end_of_assignment, - [98] = 1, - ACTIONS(67), 1, + [171] = 1, + ACTIONS(99), 1, sym__end_of_assignment, + [175] = 1, + ACTIONS(101), 1, + sym_identifier, + [179] = 1, + ACTIONS(103), 1, + anon_sym_RBRACE, + [183] = 1, + ACTIONS(105), 1, + sym_identifier, }; static const uint32_t ts_small_parse_table_map[] = { [SMALL_STATE(3)] = 0, [SMALL_STATE(4)] = 14, [SMALL_STATE(5)] = 28, - [SMALL_STATE(6)] = 34, - [SMALL_STATE(7)] = 40, - [SMALL_STATE(8)] = 47, - [SMALL_STATE(9)] = 54, - [SMALL_STATE(10)] = 58, - [SMALL_STATE(11)] = 62, - [SMALL_STATE(12)] = 66, - [SMALL_STATE(13)] = 70, - [SMALL_STATE(14)] = 74, - [SMALL_STATE(15)] = 78, - [SMALL_STATE(16)] = 82, - [SMALL_STATE(17)] = 86, - [SMALL_STATE(18)] = 90, - [SMALL_STATE(19)] = 94, - [SMALL_STATE(20)] = 98, + [SMALL_STATE(6)] = 42, + [SMALL_STATE(7)] = 56, + [SMALL_STATE(8)] = 70, + [SMALL_STATE(9)] = 76, + [SMALL_STATE(10)] = 82, + [SMALL_STATE(11)] = 90, + [SMALL_STATE(12)] = 98, + [SMALL_STATE(13)] = 105, + [SMALL_STATE(14)] = 112, + [SMALL_STATE(15)] = 119, + [SMALL_STATE(16)] = 123, + [SMALL_STATE(17)] = 127, + [SMALL_STATE(18)] = 131, + [SMALL_STATE(19)] = 135, + [SMALL_STATE(20)] = 139, + [SMALL_STATE(21)] = 143, + [SMALL_STATE(22)] = 147, + [SMALL_STATE(23)] = 151, + [SMALL_STATE(24)] = 155, + [SMALL_STATE(25)] = 159, + [SMALL_STATE(26)] = 163, + [SMALL_STATE(27)] = 167, + [SMALL_STATE(28)] = 171, + [SMALL_STATE(29)] = 175, + [SMALL_STATE(30)] = 179, + [SMALL_STATE(31)] = 183, }; static const TSParseActionEntry ts_parse_actions[] = { @@ -755,36 +891,54 @@ static const TSParseActionEntry ts_parse_actions[] = { [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(4), - [7] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), - [9] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), - [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), - [13] = {.entry = {.count = 1, .reusable = false}}, SHIFT(12), - [15] = {.entry = {.count = 1, .reusable = false}}, SHIFT(11), - [17] = {.entry = {.count = 1, .reusable = false}}, SHIFT(14), - [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), - [21] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), - [23] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(3), - [26] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(9), - [29] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_document, 1, 0, 0), - [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), - [33] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_assignment, 3, 0, 1), - [35] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_assignment, 4, 0, 2), - [37] = {.entry = {.count = 1, .reusable = false}}, SHIFT(18), - [39] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), - [41] = {.entry = {.count = 1, .reusable = false}}, SHIFT(16), - [43] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), - [45] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), - [47] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), - [49] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_number, 1, 0, 0), - [51] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_integer, 1, 0, 0), - [53] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_string, 1, 0, 0), - [55] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), - [57] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), - [59] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__string, 2, 0, 0), - [61] = {.entry = {.count = 1, .reusable = true}}, SHIFT(20), - [63] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__literal_string, 2, 0, 0), - [65] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__literal_string, 3, 0, 0), - [67] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__string, 3, 0, 0), + [7] = {.entry = {.count = 1, .reusable = true}}, SHIFT(16), + [9] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), + [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(12), + [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), + [15] = {.entry = {.count = 1, .reusable = false}}, SHIFT(17), + [17] = {.entry = {.count = 1, .reusable = false}}, SHIFT(18), + [19] = {.entry = {.count = 1, .reusable = false}}, SHIFT(19), + [21] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), + [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(3), + [28] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(16), + [31] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_document, 1, 0, 0), + [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), + [35] = {.entry = {.count = 1, .reusable = false}}, SHIFT(14), + [37] = {.entry = {.count = 1, .reusable = false}}, SHIFT(25), + [39] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), + [41] = {.entry = {.count = 1, .reusable = false}}, SHIFT(28), + [43] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), + [45] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym__string_repeat1, 2, 0, 0), SHIFT_REPEAT(14), + [48] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym__string_repeat1, 2, 0, 0), + [50] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__string_repeat1, 2, 0, 0), SHIFT_REPEAT(7), + [53] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_assignment, 3, 0, 1), + [55] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_assignment, 4, 0, 2), + [57] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_variable, 2, 0, 0), + [59] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_variable, 2, 0, 0), + [61] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_variable, 4, 0, 0), + [63] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_variable, 4, 0, 0), + [65] = {.entry = {.count = 1, .reusable = false}}, SHIFT(22), + [67] = {.entry = {.count = 1, .reusable = true}}, SHIFT(26), + [69] = {.entry = {.count = 1, .reusable = true}}, SHIFT(21), + [71] = {.entry = {.count = 1, .reusable = true}}, SHIFT(29), + [73] = {.entry = {.count = 1, .reusable = true}}, SHIFT(10), + [75] = {.entry = {.count = 1, .reusable = true}}, SHIFT(31), + [77] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), + [79] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), + [81] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_integer, 1, 0, 0), + [83] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_number, 1, 0, 0), + [85] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), + [87] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_string, 1, 0, 0), + [89] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__literal_string, 2, 0, 0), + [91] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), + [93] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__literal_string, 3, 0, 0), + [95] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__string, 2, 0, 0), + [97] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), + [99] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__string, 3, 0, 0), + [101] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23), + [103] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), + [105] = {.entry = {.count = 1, .reusable = true}}, SHIFT(30), }; enum ts_external_scanner_symbol_identifiers { diff --git a/test/corpus/variables.txt b/test/corpus/variables.txt new file mode 100644 index 0000000..9aa9511 --- /dev/null +++ b/test/corpus/variables.txt @@ -0,0 +1,44 @@ +================================================================================ +Variables +================================================================================ + +BASIC = $VARIABLE +GROUP = ${VARIABLE} + +-------------------------------------------------------------------------------- + +(document + (assignment + key: (identifier) + value: (variable + (identifier))) + (assignment + key: (identifier) + value: (variable + (identifier)))) + +================================================================================ +Variables in strings +================================================================================ + +UNDERSCORE = "$VARIABLE_WITH_UNDERSCORE" +MULTIPLE = "variable is: ${VARIABLE}, and $ANOTHER !!!" + +-------------------------------------------------------------------------------- + +(document + (assignment + key: (identifier) + value: (string + (variable + (identifier)))) + (assignment + key: (identifier) + value: (string + (string_content) + (variable + (identifier)) + (string_content) + (variable + (identifier)) + (string_content))))