diff --git a/grammar.js b/grammar.js index e1536ae..826b7cd 100644 --- a/grammar.js +++ b/grammar.js @@ -28,7 +28,7 @@ module.exports = grammar({ assignment: ($) => seq( field("left", $.identifier), - field("operator", choice("=", "+=")), + field("operator", alias(choice("=", "+="), $.operator)), field("right", $._expr), ), @@ -189,7 +189,7 @@ module.exports = grammar({ binary_expression: ($) => prec.left(seq( field("left", $._expr), - field("operator", "+"), + field("operator", alias("+", $.operator)), field("right", $._expr), )), diff --git a/src/grammar.json b/src/grammar.json index 5561434..b071135 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -49,17 +49,22 @@ "type": "FIELD", "name": "operator", "content": { - "type": "CHOICE", - "members": [ - { - "type": "STRING", - "value": "=" - }, - { - "type": "STRING", - "value": "+=" - } - ] + "type": "ALIAS", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "=" + }, + { + "type": "STRING", + "value": "+=" + } + ] + }, + "named": true, + "value": "operator" } }, { @@ -852,8 +857,13 @@ "type": "FIELD", "name": "operator", "content": { - "type": "STRING", - "value": "+" + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "+" + }, + "named": true, + "value": "operator" } }, { diff --git a/src/node-types.json b/src/node-types.json index 9a87060..9ae331f 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -18,12 +18,8 @@ "required": true, "types": [ { - "type": "+=", - "named": false - }, - { - "type": "=", - "named": false + "type": "operator", + "named": true } ] }, @@ -122,8 +118,8 @@ "required": true, "types": [ { - "type": "+", - "named": false + "type": "operator", + "named": true } ] }, @@ -648,14 +644,6 @@ "type": ")", "named": false }, - { - "type": "+", - "named": false - }, - { - "type": "+=", - "named": false - }, { "type": ",", "named": false @@ -696,6 +684,10 @@ "type": "identifier", "named": true }, + { + "type": "operator", + "named": true + }, { "type": "raw_string_literal", "named": true diff --git a/src/parser.c b/src/parser.c index 601e5eb..469d88f 100644 --- a/src/parser.c +++ b/src/parser.c @@ -14,7 +14,7 @@ #define EXTERNAL_TOKEN_COUNT 0 #define FIELD_COUNT 12 #define MAX_ALIAS_SEQUENCE_LENGTH 6 -#define PRODUCTION_ID_COUNT 19 +#define PRODUCTION_ID_COUNT 20 enum ts_symbol_identifiers { anon_sym_POUND = 1, @@ -84,7 +84,7 @@ static const char * const ts_symbol_names[] = { [anon_sym_POUND] = "#", [aux_sym_comment_token1] = "comment_token1", [anon_sym_EQ] = "=", - [anon_sym_PLUS_EQ] = "+=", + [anon_sym_PLUS_EQ] = "operator", [anon_sym_LBRACE] = "{", [anon_sym_COMMA] = ",", [anon_sym_RBRACE] = "}", @@ -110,7 +110,7 @@ static const char * const ts_symbol_names[] = { [anon_sym_unset] = "unset", [anon_sym_LBRACK] = "[", [anon_sym_RBRACK] = "]", - [anon_sym_PLUS] = "+", + [anon_sym_PLUS] = "operator", [sym_source_file] = "source_file", [sym__definition] = "_definition", [sym_comment] = "comment", @@ -174,7 +174,7 @@ static const TSSymbol ts_symbol_map[] = { [anon_sym_unset] = anon_sym_unset, [anon_sym_LBRACK] = anon_sym_LBRACK, [anon_sym_RBRACK] = anon_sym_RBRACK, - [anon_sym_PLUS] = anon_sym_PLUS, + [anon_sym_PLUS] = anon_sym_PLUS_EQ, [sym_source_file] = sym_source_file, [sym__definition] = sym__definition, [sym_comment] = sym_comment, @@ -226,7 +226,7 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { }, [anon_sym_PLUS_EQ] = { .visible = true, - .named = false, + .named = true, }, [anon_sym_LBRACE] = { .visible = true, @@ -330,7 +330,7 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { }, [anon_sym_PLUS] = { .visible = true, - .named = false, + .named = true, }, [sym_source_file] = { .visible = true, @@ -494,16 +494,17 @@ static const TSFieldMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { [6] = {.index = 11, .length = 3}, [7] = {.index = 14, .length = 3}, [8] = {.index = 17, .length = 1}, - [9] = {.index = 18, .length = 2}, - [10] = {.index = 20, .length = 5}, - [11] = {.index = 25, .length = 2}, - [12] = {.index = 27, .length = 4}, - [13] = {.index = 31, .length = 4}, - [14] = {.index = 35, .length = 2}, - [15] = {.index = 37, .length = 2}, - [16] = {.index = 39, .length = 2}, - [17] = {.index = 41, .length = 4}, - [18] = {.index = 45, .length = 2}, + [9] = {.index = 3, .length = 3}, + [10] = {.index = 18, .length = 2}, + [11] = {.index = 20, .length = 5}, + [12] = {.index = 25, .length = 2}, + [13] = {.index = 27, .length = 4}, + [14] = {.index = 31, .length = 4}, + [15] = {.index = 35, .length = 2}, + [16] = {.index = 37, .length = 2}, + [17] = {.index = 39, .length = 2}, + [18] = {.index = 41, .length = 4}, + [19] = {.index = 45, .length = 2}, }; static const TSFieldMapEntry ts_field_map_entries[] = { @@ -576,6 +577,9 @@ static const TSFieldMapEntry ts_field_map_entries[] = { static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT][MAX_ALIAS_SEQUENCE_LENGTH] = { [0] = {0}, + [3] = { + [1] = anon_sym_PLUS_EQ, + }, }; static const uint16_t ts_non_terminal_alias_map[] = { @@ -7318,17 +7322,17 @@ static const TSParseActionEntry ts_parse_actions[] = { [55] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_source_file_repeat1, 2), [57] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_source_file_repeat1, 2), SHIFT_REPEAT(43), [60] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_interpreted_string_literal, 3), - [62] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_expression, 4, .production_id = 14), + [62] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_expression, 4, .production_id = 15), [64] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_expression, 2), [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_integer_literal, 1), [68] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_map_expression, 3, .production_id = 7), [70] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_expression, 6), [72] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_expression, 4, .production_id = 8), - [74] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_expression, 5, .production_id = 14), - [76] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_map_expression, 5, .production_id = 13), - [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_map_expression, 4, .production_id = 13), + [74] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_list_expression, 5, .production_id = 15), + [76] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_map_expression, 5, .production_id = 14), + [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_map_expression, 4, .production_id = 14), [80] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_map_expression, 4, .production_id = 7), - [82] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_binary_expression, 3, .production_id = 3), + [82] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_binary_expression, 3, .production_id = 9), [84] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_map_expression, 2), [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean_literal, 1), [88] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_integer_literal, 2), @@ -7352,8 +7356,8 @@ static const TSParseActionEntry ts_parse_actions[] = { [125] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_interpreted_string_literal_repeat1, 2), SHIFT_REPEAT(59), [128] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), [130] = {.entry = {.count = 1, .reusable = true}}, SHIFT(20), - [132] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_expression_repeat1, 2, .production_id = 15), SHIFT_REPEAT(11), - [135] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_expression_repeat1, 2, .production_id = 15), + [132] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_list_expression_repeat1, 2, .production_id = 16), SHIFT_REPEAT(11), + [135] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_list_expression_repeat1, 2, .production_id = 16), [137] = {.entry = {.count = 1, .reusable = true}}, SHIFT(64), [139] = {.entry = {.count = 1, .reusable = true}}, SHIFT(73), [141] = {.entry = {.count = 1, .reusable = true}}, SHIFT(72), @@ -7374,23 +7378,23 @@ static const TSParseActionEntry ts_parse_actions[] = { [171] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_interpreted_string_literal_repeat1, 1), [173] = {.entry = {.count = 1, .reusable = true}}, SHIFT(52), [175] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23), - [177] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__colon_property, 3, .production_id = 9), + [177] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__colon_property, 3, .production_id = 10), [179] = {.entry = {.count = 1, .reusable = true}}, SHIFT(58), [181] = {.entry = {.count = 1, .reusable = true}}, SHIFT(83), [183] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), [185] = {.entry = {.count = 1, .reusable = true}}, SHIFT(84), [187] = {.entry = {.count = 1, .reusable = true}}, SHIFT(49), [189] = {.entry = {.count = 1, .reusable = true}}, SHIFT(88), - [191] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__old_module_repeat1, 2, .production_id = 11), SHIFT_REPEAT(85), - [194] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__old_module_repeat1, 2, .production_id = 11), - [196] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__equal_property, 3, .production_id = 9), - [198] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__new_module_repeat1, 2, .production_id = 11), SHIFT_REPEAT(87), - [201] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__new_module_repeat1, 2, .production_id = 11), + [191] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__old_module_repeat1, 2, .production_id = 12), SHIFT_REPEAT(85), + [194] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__old_module_repeat1, 2, .production_id = 12), + [196] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__equal_property, 3, .production_id = 10), + [198] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__new_module_repeat1, 2, .production_id = 12), SHIFT_REPEAT(87), + [201] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__new_module_repeat1, 2, .production_id = 12), [203] = {.entry = {.count = 1, .reusable = true}}, SHIFT(86), [205] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__definition, 1), [207] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_source_file_repeat1, 1), [209] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__new_module, 5, .production_id = 6), - [211] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__old_module, 5, .production_id = 10), + [211] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__old_module, 5, .production_id = 11), [213] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__old_module_repeat1, 2, .production_id = 7), [215] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__case_value, 1), [217] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__new_module, 3), @@ -7401,16 +7405,16 @@ static const TSParseActionEntry ts_parse_actions[] = { [227] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__old_module, 3, .production_id = 4), [229] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_module, 1, .production_id = 2), [231] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__old_module, 4, .production_id = 5), - [233] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__old_module, 6, .production_id = 10), - [235] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__new_module, 6, .production_id = 12), + [233] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__old_module, 6, .production_id = 11), + [235] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__new_module, 6, .production_id = 13), [237] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__new_module, 4, .production_id = 6), - [239] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__new_module, 5, .production_id = 12), + [239] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__new_module, 5, .production_id = 13), [241] = {.entry = {.count = 1, .reusable = false}}, SHIFT(119), [243] = {.entry = {.count = 1, .reusable = true}}, SHIFT(118), [245] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), [247] = {.entry = {.count = 1, .reusable = true}}, SHIFT(42), [249] = {.entry = {.count = 1, .reusable = true}}, SHIFT(106), - [251] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_soong_config_variable, 6, .production_id = 17), + [251] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_soong_config_variable, 6, .production_id = 18), [253] = {.entry = {.count = 1, .reusable = true}}, SHIFT(36), [255] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_cases, 2), [257] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), @@ -7421,7 +7425,7 @@ static const TSParseActionEntry ts_parse_actions[] = { [267] = {.entry = {.count = 1, .reusable = true}}, SHIFT(41), [269] = {.entry = {.count = 1, .reusable = true}}, SHIFT(33), [271] = {.entry = {.count = 1, .reusable = true}}, SHIFT(78), - [273] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_value, 4, .production_id = 16), + [273] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_value, 4, .production_id = 17), [275] = {.entry = {.count = 1, .reusable = true}}, SHIFT(95), [277] = {.entry = {.count = 1, .reusable = true}}, SHIFT(117), [279] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_cases, 3), @@ -7429,8 +7433,8 @@ static const TSParseActionEntry ts_parse_actions[] = { [283] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), [285] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), [287] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), - [289] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_default_case, 3, .production_id = 18), - [291] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_case, 3, .production_id = 18), + [289] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_default_case, 3, .production_id = 19), + [291] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_case, 3, .production_id = 19), [293] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_select_cases, 4), [295] = {.entry = {.count = 1, .reusable = true}}, SHIFT(102), [297] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_comment, 2), diff --git a/test/corpus/definitions.txt b/test/corpus/definitions.txt index 87a24a5..06a3c4c 100644 --- a/test/corpus/definitions.txt +++ b/test/corpus/definitions.txt @@ -17,6 +17,7 @@ foo = 42 (source_file (assignment (identifier) + (operator) (integer_literal))) ================================================================================ @@ -30,6 +31,7 @@ foo = bar (source_file (assignment (identifier) + (operator) (identifier))) ================================================================================ @@ -43,6 +45,7 @@ foo += 12 (source_file (assignment (identifier) + (operator) (integer_literal))) ================================================================================ @@ -57,9 +60,11 @@ bar = 27 (source_file (assignment (identifier) + (operator) (integer_literal)) (assignment (identifier) + (operator) (integer_literal))) ================================================================================ @@ -78,19 +83,25 @@ qux += 1 (source_file (assignment (identifier) + (operator) (integer_literal)) (assignment (identifier) + (operator) (integer_literal)) (assignment (identifier) + (operator) (integer_literal)) (assignment (identifier) + (operator) (integer_literal)) (assignment (identifier) + (operator) (integer_literal)) (assignment (identifier) + (operator) (integer_literal))) diff --git a/test/corpus/expressions.txt b/test/corpus/expressions.txt index 25584d6..9a8bfe1 100644 --- a/test/corpus/expressions.txt +++ b/test/corpus/expressions.txt @@ -10,9 +10,11 @@ foo = true (source_file (assignment (identifier) + (operator) (boolean_literal)) (assignment (identifier) + (operator) (boolean_literal))) ================================================================================ @@ -27,9 +29,11 @@ false = true (source_file (assignment (identifier) + (operator) (boolean_literal)) (assignment (identifier) + (operator) (boolean_literal))) ================================================================================ @@ -44,9 +48,11 @@ foo = 42 (source_file (assignment (identifier) + (operator) (integer_literal)) (assignment (identifier) + (operator) (integer_literal))) ================================================================================ @@ -61,9 +67,11 @@ foo = -42 (source_file (assignment (identifier) + (operator) (integer_literal)) (assignment (identifier) + (operator) (integer_literal))) ================================================================================ @@ -77,6 +85,7 @@ foo = "Hello World!" (source_file (assignment (identifier) + (operator) (interpreted_string_literal))) ================================================================================ @@ -90,6 +99,7 @@ foo = "Hello\nWorld!" (source_file (assignment (identifier) + (operator) (interpreted_string_literal (escape_sequence)))) @@ -104,6 +114,7 @@ foo = `Hello\nWorld!` (source_file (assignment (identifier) + (operator) (raw_string_literal))) ================================================================================ @@ -117,6 +128,7 @@ foo = [] (source_file (assignment (identifier) + (operator) (list_expression))) ================================================================================ @@ -130,6 +142,7 @@ foo = [42] (source_file (assignment (identifier) + (operator) (list_expression (integer_literal)))) @@ -146,6 +159,7 @@ foo = [ (source_file (assignment (identifier) + (operator) (list_expression (integer_literal)))) @@ -162,6 +176,7 @@ foo = [ (source_file (assignment (identifier) + (operator) (list_expression (integer_literal)))) @@ -179,6 +194,7 @@ foo = [ (source_file (assignment (identifier) + (operator) (list_expression (integer_literal) (interpreted_string_literal)))) @@ -198,6 +214,7 @@ foo = [ (source_file (assignment (identifier) + (operator) (list_expression (list_expression (integer_literal)) @@ -218,6 +235,7 @@ foo = [ (source_file (assignment (identifier) + (operator) (list_expression (ERROR)))) @@ -232,6 +250,7 @@ foo = {} (source_file (assignment (identifier) + (operator) (map_expression))) ================================================================================ @@ -245,6 +264,7 @@ foo = {foo:42} (source_file (assignment (identifier) + (operator) (map_expression (property (identifier) @@ -263,6 +283,7 @@ foo = { (source_file (assignment (identifier) + (operator) (map_expression (property (identifier) @@ -281,6 +302,7 @@ foo = { (source_file (assignment (identifier) + (operator) (map_expression (property (identifier) @@ -300,6 +322,7 @@ foo = { (source_file (assignment (identifier) + (operator) (map_expression (property (identifier) @@ -321,6 +344,7 @@ foo = { (source_file (assignment (identifier) + (operator) (map_expression (property (identifier) @@ -342,6 +366,7 @@ foo = { (source_file (assignment (identifier) + (operator) (map_expression (ERROR)))) @@ -359,12 +384,16 @@ foo = [ (source_file (assignment (identifier) + (operator) (list_expression (binary_expression (binary_expression (integer_literal) + (operator) (integer_literal)) + (operator) (integer_literal)) (binary_expression (interpreted_string_literal) + (operator) (interpreted_string_literal))))) diff --git a/test/corpus/select.txt b/test/corpus/select.txt index 2f6ce71..92f1342 100644 --- a/test/corpus/select.txt +++ b/test/corpus/select.txt @@ -12,6 +12,7 @@ foo = select(release_variable("RELEASE_TEST"), { (source_file (assignment (identifier) + (operator) (select_expression (select_value (selection_type) @@ -37,6 +38,7 @@ foo = select(soong_config_variable("my_namespace", "my_var"), { (source_file (assignment (identifier) + (operator) (select_expression (soong_config_variable (selection_type) @@ -66,6 +68,7 @@ foo = select(variant("arch"), { (source_file (assignment (identifier) + (operator) (select_expression (select_value (selection_type) @@ -95,6 +98,7 @@ foo = select(variant("VARIANT"), {}) (source_file (assignment (identifier) + (operator) (select_expression (select_value (selection_type) @@ -118,6 +122,7 @@ foo = select(variant("VARIANT"), { (source_file (assignment (identifier) + (operator) (select_expression (select_value (selection_type) @@ -153,6 +158,7 @@ foo = select(variant(), { (source_file (assignment (identifier) + (operator) (select_expression (select_value (selection_type) @@ -178,6 +184,7 @@ foo = select(some_unknown_type("CONDITION"), { (source_file (assignment (identifier) + (operator) (ERROR (identifier) (identifier)