From 2549f6f0dbf72d70e2f0772c4a565ea21b0b9842 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 8 Apr 2024 01:49:24 +0100 Subject: [PATCH] Add 'property' alias It makes the syntax tree more readable. --- grammar.js | 12 +- src/grammar.json | 90 ++++++++++----- src/node-types.json | 222 +++++++++--------------------------- src/parser.c | 100 +++++++--------- test/corpus/expressions.txt | 33 +++--- test/corpus/modules.txt | 37 +++--- 6 files changed, 210 insertions(+), 284 deletions(-) diff --git a/grammar.js b/grammar.js index 41f2ad1..f07c99a 100644 --- a/grammar.js +++ b/grammar.js @@ -41,14 +41,18 @@ module.exports = grammar({ _old_module: ($) => seq( field("type", $.identifier), "{", - optional(commaSeparated(field("property", $._colon_property))), + optional(commaSeparated( + alias(field("property", $._colon_property), $.property) + )), "}", ), _new_module: ($) => seq( $.identifier, "(", - optional(commaSeparated(field("property", $._equal_property))), + optional(commaSeparated( + alias(field("property", $._equal_property), $.property) + )), ")", ), @@ -175,7 +179,9 @@ module.exports = grammar({ map_expression: ($) => seq( "{", - optional(commaSeparated(field("property", $._colon_property))), + optional(commaSeparated( + alias(field("property", $._colon_property), $.property) + )), "}", ), diff --git a/src/grammar.json b/src/grammar.json index 078d39d..e5a5ec7 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -107,12 +107,17 @@ "type": "SEQ", "members": [ { - "type": "FIELD", - "name": "property", + "type": "ALIAS", "content": { - "type": "SYMBOL", - "name": "_colon_property" - } + "type": "FIELD", + "name": "property", + "content": { + "type": "SYMBOL", + "name": "_colon_property" + } + }, + "named": true, + "value": "property" }, { "type": "REPEAT", @@ -124,12 +129,17 @@ "value": "," }, { - "type": "FIELD", - "name": "property", + "type": "ALIAS", "content": { - "type": "SYMBOL", - "name": "_colon_property" - } + "type": "FIELD", + "name": "property", + "content": { + "type": "SYMBOL", + "name": "_colon_property" + } + }, + "named": true, + "value": "property" } ] } @@ -177,12 +187,17 @@ "type": "SEQ", "members": [ { - "type": "FIELD", - "name": "property", + "type": "ALIAS", "content": { - "type": "SYMBOL", - "name": "_equal_property" - } + "type": "FIELD", + "name": "property", + "content": { + "type": "SYMBOL", + "name": "_equal_property" + } + }, + "named": true, + "value": "property" }, { "type": "REPEAT", @@ -194,12 +209,17 @@ "value": "," }, { - "type": "FIELD", - "name": "property", + "type": "ALIAS", "content": { - "type": "SYMBOL", - "name": "_equal_property" - } + "type": "FIELD", + "name": "property", + "content": { + "type": "SYMBOL", + "name": "_equal_property" + } + }, + "named": true, + "value": "property" } ] } @@ -748,12 +768,17 @@ "type": "SEQ", "members": [ { - "type": "FIELD", - "name": "property", + "type": "ALIAS", "content": { - "type": "SYMBOL", - "name": "_colon_property" - } + "type": "FIELD", + "name": "property", + "content": { + "type": "SYMBOL", + "name": "_colon_property" + } + }, + "named": true, + "value": "property" }, { "type": "REPEAT", @@ -765,12 +790,17 @@ "value": "," }, { - "type": "FIELD", - "name": "property", + "type": "ALIAS", "content": { - "type": "SYMBOL", - "name": "_colon_property" - } + "type": "FIELD", + "name": "property", + "content": { + "type": "SYMBOL", + "name": "_colon_property" + } + }, + "named": true, + "value": "property" } ] } diff --git a/src/node-types.json b/src/node-types.json index 6314f91..73e03df 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -203,92 +203,12 @@ "type": "map_expression", "named": true, "fields": { - "field": { - "multiple": true, - "required": false, - "types": [ - { - "type": "identifier", - "named": true - } - ] - }, "property": { "multiple": true, "required": false, "types": [ { - "type": ":", - "named": false - }, - { - "type": "boolean_literal", - "named": true - }, - { - "type": "identifier", - "named": true - }, - { - "type": "integer_literal", - "named": true - }, - { - "type": "interpreted_string_literal", - "named": true - }, - { - "type": "list_expression", - "named": true - }, - { - "type": "map_expression", - "named": true - }, - { - "type": "raw_string_literal", - "named": true - }, - { - "type": "select_expression", - "named": true - } - ] - }, - "value": { - "multiple": true, - "required": false, - "types": [ - { - "type": "boolean_literal", - "named": true - }, - { - "type": "identifier", - "named": true - }, - { - "type": "integer_literal", - "named": true - }, - { - "type": "interpreted_string_literal", - "named": true - }, - { - "type": "list_expression", - "named": true - }, - { - "type": "map_expression", - "named": true - }, - { - "type": "raw_string_literal", - "named": true - }, - { - "type": "select_expression", + "type": "property", "named": true } ] @@ -299,58 +219,12 @@ "type": "module", "named": true, "fields": { - "field": { - "multiple": true, - "required": false, - "types": [ - { - "type": "identifier", - "named": true - } - ] - }, "property": { "multiple": true, "required": false, "types": [ { - "type": ":", - "named": false - }, - { - "type": "=", - "named": false - }, - { - "type": "boolean_literal", - "named": true - }, - { - "type": "identifier", - "named": true - }, - { - "type": "integer_literal", - "named": true - }, - { - "type": "interpreted_string_literal", - "named": true - }, - { - "type": "list_expression", - "named": true - }, - { - "type": "map_expression", - "named": true - }, - { - "type": "raw_string_literal", - "named": true - }, - { - "type": "select_expression", + "type": "property", "named": true } ] @@ -364,44 +238,6 @@ "named": true } ] - }, - "value": { - "multiple": true, - "required": false, - "types": [ - { - "type": "boolean_literal", - "named": true - }, - { - "type": "identifier", - "named": true - }, - { - "type": "integer_literal", - "named": true - }, - { - "type": "interpreted_string_literal", - "named": true - }, - { - "type": "list_expression", - "named": true - }, - { - "type": "map_expression", - "named": true - }, - { - "type": "raw_string_literal", - "named": true - }, - { - "type": "select_expression", - "named": true - } - ] } }, "children": { @@ -415,6 +251,60 @@ ] } }, + { + "type": "property", + "named": true, + "fields": { + "field": { + "multiple": false, + "required": true, + "types": [ + { + "type": "identifier", + "named": true + } + ] + }, + "value": { + "multiple": false, + "required": true, + "types": [ + { + "type": "boolean_literal", + "named": true + }, + { + "type": "identifier", + "named": true + }, + { + "type": "integer_literal", + "named": true + }, + { + "type": "interpreted_string_literal", + "named": true + }, + { + "type": "list_expression", + "named": true + }, + { + "type": "map_expression", + "named": true + }, + { + "type": "raw_string_literal", + "named": true + }, + { + "type": "select_expression", + "named": true + } + ] + } + } + }, { "type": "select_case", "named": true, diff --git a/src/parser.c b/src/parser.c index dbc00fd..0341730 100644 --- a/src/parser.c +++ b/src/parser.c @@ -129,8 +129,8 @@ static const char * const ts_symbol_names[] = { [sym__case_value] = "_case_value", [sym_list_expression] = "list_expression", [sym_map_expression] = "map_expression", - [sym__colon_property] = "_colon_property", - [sym__equal_property] = "_equal_property", + [sym__colon_property] = "property", + [sym__equal_property] = "property", [aux_sym_source_file_repeat1] = "source_file_repeat1", [aux_sym__old_module_repeat1] = "_old_module_repeat1", [aux_sym__new_module_repeat1] = "_new_module_repeat1", @@ -192,7 +192,7 @@ static const TSSymbol ts_symbol_map[] = { [sym_list_expression] = sym_list_expression, [sym_map_expression] = sym_map_expression, [sym__colon_property] = sym__colon_property, - [sym__equal_property] = sym__equal_property, + [sym__equal_property] = sym__colon_property, [aux_sym_source_file_repeat1] = aux_sym_source_file_repeat1, [aux_sym__old_module_repeat1] = aux_sym__old_module_repeat1, [aux_sym__new_module_repeat1] = aux_sym__new_module_repeat1, @@ -407,11 +407,11 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .named = true, }, [sym__colon_property] = { - .visible = false, + .visible = true, .named = true, }, [sym__equal_property] = { - .visible = false, + .visible = true, .named = true, }, [aux_sym_source_file_repeat1] = { @@ -472,104 +472,90 @@ static const char * const ts_field_names[] = { }; static const TSFieldMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { - [1] = {.index = 0, .length = 4}, - [2] = {.index = 4, .length = 3}, - [3] = {.index = 7, .length = 3}, - [4] = {.index = 10, .length = 1}, - [5] = {.index = 11, .length = 4}, - [6] = {.index = 15, .length = 3}, - [7] = {.index = 18, .length = 3}, - [8] = {.index = 21, .length = 1}, - [9] = {.index = 22, .length = 2}, - [10] = {.index = 24, .length = 7}, - [11] = {.index = 31, .length = 6}, - [12] = {.index = 37, .length = 6}, - [13] = {.index = 43, .length = 6}, - [14] = {.index = 49, .length = 2}, - [15] = {.index = 51, .length = 2}, - [16] = {.index = 53, .length = 2}, - [17] = {.index = 55, .length = 4}, - [18] = {.index = 59, .length = 2}, + [1] = {.index = 0, .length = 2}, + [2] = {.index = 2, .length = 1}, + [3] = {.index = 3, .length = 3}, + [4] = {.index = 6, .length = 1}, + [5] = {.index = 7, .length = 4}, + [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}, }; static const TSFieldMapEntry ts_field_map_entries[] = { [0] = - {field_field, 0, .inherited = true}, {field_property, 0, .inherited = true}, {field_type, 0, .inherited = true}, - {field_value, 0, .inherited = true}, - [4] = - {field_field, 0, .inherited = true}, + [2] = {field_property, 0, .inherited = true}, - {field_value, 0, .inherited = true}, - [7] = + [3] = {field_left, 0}, {field_operator, 1}, {field_right, 2}, - [10] = + [6] = {field_type, 0}, + [7] = + {field_field, 2, .inherited = true}, + {field_property, 2}, + {field_type, 0}, + {field_value, 2, .inherited = true}, [11] = {field_field, 2, .inherited = true}, {field_property, 2}, - {field_type, 0}, {field_value, 2, .inherited = true}, - [15] = - {field_field, 2, .inherited = true}, - {field_property, 2}, - {field_value, 2, .inherited = true}, - [18] = + [14] = {field_field, 1, .inherited = true}, {field_property, 1}, {field_value, 1, .inherited = true}, - [21] = + [17] = {field_element, 1}, - [22] = + [18] = {field_field, 0}, {field_value, 2}, - [24] = + [20] = {field_field, 2, .inherited = true}, - {field_field, 3, .inherited = true}, {field_property, 2}, {field_property, 3, .inherited = true}, {field_type, 0}, {field_value, 2, .inherited = true}, - {field_value, 3, .inherited = true}, - [31] = - {field_field, 0, .inherited = true}, - {field_field, 1, .inherited = true}, + [25] = {field_property, 0, .inherited = true}, {field_property, 1, .inherited = true}, - {field_value, 0, .inherited = true}, - {field_value, 1, .inherited = true}, - [37] = + [27] = {field_field, 2, .inherited = true}, - {field_field, 3, .inherited = true}, {field_property, 2}, {field_property, 3, .inherited = true}, {field_value, 2, .inherited = true}, - {field_value, 3, .inherited = true}, - [43] = + [31] = {field_field, 1, .inherited = true}, - {field_field, 2, .inherited = true}, {field_property, 1}, {field_property, 2, .inherited = true}, {field_value, 1, .inherited = true}, - {field_value, 2, .inherited = true}, - [49] = + [35] = {field_element, 1}, {field_element, 2, .inherited = true}, - [51] = + [37] = {field_element, 0, .inherited = true}, {field_element, 1, .inherited = true}, - [53] = + [39] = {field_condition, 2}, {field_type, 0}, - [55] = + [41] = {field_condition, 3}, {field_namespace, 2}, {field_type, 0}, {field_variable, 4}, - [59] = + [45] = {field_pattern, 0}, {field_value, 2}, }; diff --git a/test/corpus/expressions.txt b/test/corpus/expressions.txt index 466737a..03682d9 100644 --- a/test/corpus/expressions.txt +++ b/test/corpus/expressions.txt @@ -246,8 +246,9 @@ foo = {foo:42} (assignment (identifier) (map_expression - (identifier) - (integer_literal)))) + (property + (identifier) + (integer_literal))))) ================================================================================ Map (singleton multiline) @@ -263,8 +264,9 @@ foo = { (assignment (identifier) (map_expression - (identifier) - (integer_literal)))) + (property + (identifier) + (integer_literal))))) ================================================================================ Map (singleton trailing comma) @@ -280,8 +282,9 @@ foo = { (assignment (identifier) (map_expression - (identifier) - (integer_literal)))) + (property + (identifier) + (integer_literal))))) ================================================================================ Map (mixed values) @@ -298,10 +301,12 @@ foo = { (assignment (identifier) (map_expression - (identifier) - (integer_literal) - (identifier) - (interpreted_string_literal)))) + (property + (identifier) + (integer_literal)) + (property + (identifier) + (interpreted_string_literal))))) ================================================================================ Map (map of map) @@ -317,10 +322,12 @@ foo = { (assignment (identifier) (map_expression - (identifier) - (map_expression + (property (identifier) - (integer_literal))))) + (map_expression + (property + (identifier) + (integer_literal))))))) ================================================================================ Map (rogue comma) diff --git a/test/corpus/modules.txt b/test/corpus/modules.txt index 943f665..73d87bc 100644 --- a/test/corpus/modules.txt +++ b/test/corpus/modules.txt @@ -36,8 +36,9 @@ foo { (source_file (module (identifier) - (identifier) - (integer_literal))) + (property + (identifier) + (integer_literal)))) ================================================================================ Single property (trailing comma) @@ -52,8 +53,9 @@ foo { (source_file (module (identifier) - (identifier) - (integer_literal))) + (property + (identifier) + (integer_literal)))) ================================================================================ Mixed values @@ -70,12 +72,15 @@ foo { (source_file (module (identifier) - (identifier) - (boolean_literal) - (identifier) - (interpreted_string_literal) - (identifier) - (integer_literal))) + (property + (identifier) + (boolean_literal)) + (property + (identifier) + (interpreted_string_literal)) + (property + (identifier) + (integer_literal)))) ================================================================================ Complex value @@ -94,11 +99,13 @@ foo { (source_file (module (identifier) - (identifier) - (list_expression - (map_expression - (identifier) - (interpreted_string_literal))))) + (property + (identifier) + (list_expression + (map_expression + (property + (identifier) + (interpreted_string_literal))))))) ================================================================================ Rogue comma