From e59130c73a655844cbdfca3d2009fd048de4931d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20L=2E=20Charlier?= Date: Thu, 13 Aug 2026 07:34:17 +0200 Subject: [PATCH 1/2] feat: add parameterized expressions --- .../SyntaxBindingTests.cs | 17 + .../Expressif.Syntax/ExpressifSyntax.cs | 12 +- .../csharp/Expressif.Syntax/SyntaxNodes.cs | 24 +- grammar.js | 10 +- src/grammar.json | 46 +- src/node-types.json | 30 + src/parser.c | 1196 +++++++++-------- test/corpus/parameterized_expressions.txt | 257 ++++ 8 files changed, 1054 insertions(+), 538 deletions(-) create mode 100644 test/corpus/parameterized_expressions.txt diff --git a/bindings/csharp/Expressif.Syntax.Tests/SyntaxBindingTests.cs b/bindings/csharp/Expressif.Syntax.Tests/SyntaxBindingTests.cs index fd1ad09..d7601e3 100644 --- a/bindings/csharp/Expressif.Syntax.Tests/SyntaxBindingTests.cs +++ b/bindings/csharp/Expressif.Syntax.Tests/SyntaxBindingTests.cs @@ -165,6 +165,23 @@ public void CompoundValuesBindNestedValuesAndRecordFields() }); } + [Test] + public void ParameterizedExpressionsPreserveSourceAndPipeline() + { + var root = (OpenExpressionSyntax)ExpressifSyntax.Parse("skip-last-chars({@length | subtract(1) | max(0)})"); + var argument = root.Pipeline.Single().Arguments.Single(); + var parameterized = (ParameterizedExpressionSyntax)argument.Value; + + Assert.Multiple(() => + { + Assert.That(parameterized.Source, Is.TypeOf()); + Assert.That(((VariableSyntax)parameterized.Source).Name, Is.EqualTo("length")); + Assert.That(parameterized.Expression.Pipeline.Select(call => call.Name), Is.EqualTo(new[] { "subtract", "max" })); + Assert.That(parameterized.Children, Is.EqualTo(new SyntaxNode[] { parameterized.Source, parameterized.Expression })); + Assert.That(parameterized.Text, Is.EqualTo("{@length | subtract(1) | max(0)}")); + }); + } + [Test] public void BinderSupportsEveryGrammarValueNodeType() { diff --git a/bindings/csharp/Expressif.Syntax/ExpressifSyntax.cs b/bindings/csharp/Expressif.Syntax/ExpressifSyntax.cs index fd5f849..7da1d9e 100644 --- a/bindings/csharp/Expressif.Syntax/ExpressifSyntax.cs +++ b/bindings/csharp/Expressif.Syntax/ExpressifSyntax.cs @@ -78,7 +78,17 @@ private static PositionalArgumentSyntax BindArgument(TsNode node) throw Unknown(node); var valueNode = SingleNamedChild(node, "positional_argument"); - return new(Span(node), node.Text, BindValue(valueNode)); + ExpressionSyntax value = valueNode.Type == "parameterized_expression" + ? BindParameterizedExpression(valueNode) + : BindValue(valueNode); + return new(Span(node), node.Text, value); + } + + private static ParameterizedExpressionSyntax BindParameterizedExpression(TsNode node) + { + var source = node.GetChildForField("source") ?? throw Unknown(node); + var expression = node.GetChildForField("expression") ?? throw Unknown(node); + return new(Span(node), node.Text, BindValue(source), BindOpen(expression)); } private static ValueSyntax BindValue(TsNode node) => node.Type switch diff --git a/bindings/csharp/Expressif.Syntax/SyntaxNodes.cs b/bindings/csharp/Expressif.Syntax/SyntaxNodes.cs index 36dfafb..1af8d80 100644 --- a/bindings/csharp/Expressif.Syntax/SyntaxNodes.cs +++ b/bindings/csharp/Expressif.Syntax/SyntaxNodes.cs @@ -21,6 +21,7 @@ public enum SyntaxKind TupleLiteral, RecordLiteral, RecordField, + ParameterizedExpression, } public readonly record struct SourceSpan(int Start, int Length) @@ -46,7 +47,7 @@ protected SyntaxNode(SyntaxKind kind, SourceSpan span, string text, IEnumerable< public IReadOnlyList Children => children; } -public abstract class RootExpressionSyntax : SyntaxNode +public abstract class RootExpressionSyntax : ExpressionSyntax { protected RootExpressionSyntax(SyntaxKind kind, SourceSpan span, string text, IEnumerable children) : base(kind, span, text, children) { } @@ -76,7 +77,7 @@ internal ClosedExpressionSyntax(SourceSpan span, string text, ValueSyntax value, public abstract class ExpressionSyntax : SyntaxNode { - protected ExpressionSyntax(SyntaxKind kind, SourceSpan span, string text, IEnumerable children) + protected ExpressionSyntax(SyntaxKind kind, SourceSpan span, string text, IEnumerable? children) : base(kind, span, text, children) { } } @@ -95,6 +96,19 @@ internal FunctionCallSyntax(SourceSpan span, string text, string name, bool hasP public IReadOnlyList Arguments { get; } } +public sealed class ParameterizedExpressionSyntax : ExpressionSyntax +{ + internal ParameterizedExpressionSyntax(SourceSpan span, string text, ValueSyntax source, OpenExpressionSyntax expression) + : base(SyntaxKind.ParameterizedExpression, span, text, [source, expression]) + { + Source = source; + Expression = expression; + } + + public ValueSyntax Source { get; } + public OpenExpressionSyntax Expression { get; } +} + public abstract class ArgumentSyntax : SyntaxNode { protected ArgumentSyntax(SyntaxKind kind, SourceSpan span, string text, IEnumerable children) @@ -103,13 +117,13 @@ protected ArgumentSyntax(SyntaxKind kind, SourceSpan span, string text, IEnumera public sealed class PositionalArgumentSyntax : ArgumentSyntax { - internal PositionalArgumentSyntax(SourceSpan span, string text, ValueSyntax value) + internal PositionalArgumentSyntax(SourceSpan span, string text, ExpressionSyntax value) : base(SyntaxKind.PositionalArgument, span, text, [value]) => Value = value; - public ValueSyntax Value { get; } + public ExpressionSyntax Value { get; } } -public abstract class ValueSyntax : SyntaxNode +public abstract class ValueSyntax : ExpressionSyntax { protected ValueSyntax(SyntaxKind kind, SourceSpan span, string text, IEnumerable? children = null) : base(kind, span, text, children) { } diff --git a/grammar.js b/grammar.js index 1b8af3a..e240a7a 100644 --- a/grammar.js +++ b/grammar.js @@ -48,7 +48,15 @@ export default grammar({ repeat(seq(",", $.positional_argument)), ), - positional_argument: ($) => $.value, + positional_argument: ($) => choice($.value, $.parameterized_expression), + + parameterized_expression: ($) => seq( + "{", + field("source", $.value), + "|", + field("expression", $.open_expression), + "}", + ), value: ($) => choice( $.variable, diff --git a/src/grammar.json b/src/grammar.json index 1a8e50b..3ec7bdc 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -170,8 +170,50 @@ ] }, "positional_argument": { - "type": "SYMBOL", - "name": "value" + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "value" + }, + { + "type": "SYMBOL", + "name": "parameterized_expression" + } + ] + }, + "parameterized_expression": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "source", + "content": { + "type": "SYMBOL", + "name": "value" + } + }, + { + "type": "STRING", + "value": "|" + }, + { + "type": "FIELD", + "name": "expression", + "content": { + "type": "SYMBOL", + "name": "open_expression" + } + }, + { + "type": "STRING", + "value": "}" + } + ] }, "value": { "type": "CHOICE", diff --git a/src/node-types.json b/src/node-types.json index 835618e..ce571de 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -254,6 +254,32 @@ ] } }, + { + "type": "parameterized_expression", + "named": true, + "fields": { + "expression": { + "multiple": false, + "required": true, + "types": [ + { + "type": "open_expression", + "named": true + } + ] + }, + "source": { + "multiple": false, + "required": true, + "types": [ + { + "type": "value", + "named": true + } + ] + } + } + }, { "type": "positional_argument", "named": true, @@ -262,6 +288,10 @@ "multiple": false, "required": true, "types": [ + { + "type": "parameterized_expression", + "named": true + }, { "type": "value", "named": true diff --git a/src/parser.c b/src/parser.c index 33248a2..305a842 100644 --- a/src/parser.c +++ b/src/parser.c @@ -7,16 +7,16 @@ #endif #define LANGUAGE_VERSION 15 -#define STATE_COUNT 79 -#define LARGE_STATE_COUNT 3 -#define SYMBOL_COUNT 61 +#define STATE_COUNT 84 +#define LARGE_STATE_COUNT 2 +#define SYMBOL_COUNT 62 #define ALIAS_COUNT 0 #define TOKEN_COUNT 32 #define EXTERNAL_TOKEN_COUNT 0 -#define FIELD_COUNT 4 +#define FIELD_COUNT 6 #define MAX_ALIAS_SEQUENCE_LENGTH 7 #define MAX_RESERVED_WORD_SET_SIZE 0 -#define PRODUCTION_ID_COUNT 8 +#define PRODUCTION_ID_COUNT 9 #define SUPERTYPE_COUNT 4 enum ts_symbol_identifiers { @@ -59,27 +59,28 @@ enum ts_symbol_identifiers { sym_function_call = 37, sym_argument_list = 38, sym_positional_argument = 39, - sym_value = 40, - sym_array_literal = 41, - sym_tuple_literal = 42, - sym_record_literal = 43, - sym_record_field = 44, - sym_record_field_name = 45, - sym_record_access = 46, - sym_record_field_selector = 47, - sym_immediate_record_field_selector = 48, - sym_original_record_field_selector = 49, - sym_boolean_literal = 50, - sym_quoted_literal = 51, - sym_double_quoted_literal = 52, - sym_backtick_quoted_literal = 53, - sym_temporal_literal = 54, - aux_sym_open_expression_repeat1 = 55, - aux_sym_argument_list_repeat1 = 56, - aux_sym_array_literal_repeat1 = 57, - aux_sym_record_literal_repeat1 = 58, - aux_sym_record_access_repeat1 = 59, - aux_sym_double_quoted_literal_repeat1 = 60, + sym_parameterized_expression = 40, + sym_value = 41, + sym_array_literal = 42, + sym_tuple_literal = 43, + sym_record_literal = 44, + sym_record_field = 45, + sym_record_field_name = 46, + sym_record_access = 47, + sym_record_field_selector = 48, + sym_immediate_record_field_selector = 49, + sym_original_record_field_selector = 50, + sym_boolean_literal = 51, + sym_quoted_literal = 52, + sym_double_quoted_literal = 53, + sym_backtick_quoted_literal = 54, + sym_temporal_literal = 55, + aux_sym_open_expression_repeat1 = 56, + aux_sym_argument_list_repeat1 = 57, + aux_sym_array_literal_repeat1 = 58, + aux_sym_record_literal_repeat1 = 59, + aux_sym_record_access_repeat1 = 60, + aux_sym_double_quoted_literal_repeat1 = 61, }; static const char * const ts_symbol_names[] = { @@ -123,6 +124,7 @@ static const char * const ts_symbol_names[] = { [sym_function_call] = "function_call", [sym_argument_list] = "argument_list", [sym_positional_argument] = "positional_argument", + [sym_parameterized_expression] = "parameterized_expression", [sym_value] = "value", [sym_array_literal] = "array_literal", [sym_tuple_literal] = "tuple_literal", @@ -187,6 +189,7 @@ static const TSSymbol ts_symbol_map[] = { [sym_function_call] = sym_function_call, [sym_argument_list] = sym_argument_list, [sym_positional_argument] = sym_positional_argument, + [sym_parameterized_expression] = sym_parameterized_expression, [sym_value] = sym_value, [sym_array_literal] = sym_array_literal, [sym_tuple_literal] = sym_tuple_literal, @@ -372,6 +375,10 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { .visible = true, .named = true, }, + [sym_parameterized_expression] = { + .visible = true, + .named = true, + }, [sym_value] = { .visible = false, .named = true, @@ -462,17 +469,21 @@ static const TSSymbolMetadata ts_symbol_metadata[] = { }; enum ts_field_identifiers { - field_field = 1, - field_name = 2, - field_root = 3, - field_value = 4, + field_expression = 1, + field_field = 2, + field_name = 3, + field_root = 4, + field_source = 5, + field_value = 6, }; static const char * const ts_field_names[] = { [0] = NULL, + [field_expression] = "expression", [field_field] = "field", [field_name] = "name", [field_root] = "root", + [field_source] = "source", [field_value] = "value", }; @@ -484,6 +495,7 @@ static const TSMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { [5] = {.index = 6, .length = 3}, [6] = {.index = 9, .length = 2}, [7] = {.index = 11, .length = 2}, + [8] = {.index = 13, .length = 2}, }; static const TSFieldMapEntry ts_field_map_entries[] = { @@ -507,6 +519,9 @@ static const TSFieldMapEntry ts_field_map_entries[] = { [11] = {field_name, 0}, {field_value, 2}, + [13] = + {field_expression, 3}, + {field_source, 1}, }; static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT][MAX_ALIAS_SEQUENCE_LENGTH] = { @@ -597,6 +612,11 @@ static const TSStateId ts_primary_state_ids[STATE_COUNT] = { [76] = 76, [77] = 77, [78] = 78, + [79] = 79, + [80] = 80, + [81] = 81, + [82] = 82, + [83] = 83, }; static const TSSymbol ts_supertype_symbols[SUPERTYPE_COUNT] = { @@ -1237,13 +1257,13 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [0] = {.lex_state = 0}, [1] = {.lex_state = 59}, [2] = {.lex_state = 1}, - [3] = {.lex_state = 59}, + [3] = {.lex_state = 1}, [4] = {.lex_state = 59}, [5] = {.lex_state = 59}, [6] = {.lex_state = 59}, [7] = {.lex_state = 59}, [8] = {.lex_state = 59}, - [9] = {.lex_state = 60}, + [9] = {.lex_state = 59}, [10] = {.lex_state = 60}, [11] = {.lex_state = 60}, [12] = {.lex_state = 60}, @@ -1253,11 +1273,11 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [16] = {.lex_state = 60}, [17] = {.lex_state = 60}, [18] = {.lex_state = 60}, - [19] = {.lex_state = 59}, + [19] = {.lex_state = 60}, [20] = {.lex_state = 59}, [21] = {.lex_state = 59}, [22] = {.lex_state = 59}, - [23] = {.lex_state = 0}, + [23] = {.lex_state = 59}, [24] = {.lex_state = 0}, [25] = {.lex_state = 0}, [26] = {.lex_state = 0}, @@ -1268,32 +1288,32 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [31] = {.lex_state = 0}, [32] = {.lex_state = 0}, [33] = {.lex_state = 0}, - [34] = {.lex_state = 2}, - [35] = {.lex_state = 2}, - [36] = {.lex_state = 2}, - [37] = {.lex_state = 0}, - [38] = {.lex_state = 0}, - [39] = {.lex_state = 0}, + [34] = {.lex_state = 0}, + [35] = {.lex_state = 0}, + [36] = {.lex_state = 0}, + [37] = {.lex_state = 2}, + [38] = {.lex_state = 59}, + [39] = {.lex_state = 2}, [40] = {.lex_state = 0}, [41] = {.lex_state = 0}, [42] = {.lex_state = 0}, - [43] = {.lex_state = 0}, - [44] = {.lex_state = 59}, - [45] = {.lex_state = 0}, - [46] = {.lex_state = 16}, + [43] = {.lex_state = 2}, + [44] = {.lex_state = 0}, + [45] = {.lex_state = 32}, + [46] = {.lex_state = 0}, [47] = {.lex_state = 0}, [48] = {.lex_state = 0}, [49] = {.lex_state = 0}, [50] = {.lex_state = 32}, - [51] = {.lex_state = 0}, - [52] = {.lex_state = 0}, + [51] = {.lex_state = 32}, + [52] = {.lex_state = 16}, [53] = {.lex_state = 0}, [54] = {.lex_state = 0}, [55] = {.lex_state = 0}, - [56] = {.lex_state = 32}, + [56] = {.lex_state = 0}, [57] = {.lex_state = 0}, [58] = {.lex_state = 0}, - [59] = {.lex_state = 22}, + [59] = {.lex_state = 0}, [60] = {.lex_state = 0}, [61] = {.lex_state = 0}, [62] = {.lex_state = 0}, @@ -1306,13 +1326,18 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = { [69] = {.lex_state = 0}, [70] = {.lex_state = 0}, [71] = {.lex_state = 0}, - [72] = {.lex_state = 59}, + [72] = {.lex_state = 22}, [73] = {.lex_state = 0}, - [74] = {.lex_state = 0}, + [74] = {.lex_state = 59}, [75] = {.lex_state = 0}, [76] = {.lex_state = 0}, - [77] = {.lex_state = 0}, - [78] = {.lex_state = 59}, + [77] = {.lex_state = 59}, + [78] = {.lex_state = 0}, + [79] = {.lex_state = 0}, + [80] = {.lex_state = 0}, + [81] = {.lex_state = 0}, + [82] = {.lex_state = 0}, + [83] = {.lex_state = 0}, }; static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { @@ -1349,22 +1374,22 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_time_literal] = ACTIONS(1), }, [STATE(1)] = { - [sym_source_file] = STATE(73), - [sym_root_expression] = STATE(75), - [sym_open_expression] = STATE(76), - [sym_closed_expression] = STATE(76), - [sym_expression] = STATE(47), - [sym_function_call] = STATE(60), - [sym_value] = STATE(62), + [sym_source_file] = STATE(82), + [sym_root_expression] = STATE(76), + [sym_open_expression] = STATE(79), + [sym_closed_expression] = STATE(79), + [sym_expression] = STATE(44), + [sym_function_call] = STATE(46), + [sym_value] = STATE(68), [sym_array_literal] = STATE(25), [sym_tuple_literal] = STATE(25), [sym_record_literal] = STATE(25), [sym_record_access] = STATE(25), - [sym_record_field_selector] = STATE(9), + [sym_record_field_selector] = STATE(10), [sym_boolean_literal] = STATE(25), [sym_quoted_literal] = STATE(25), - [sym_double_quoted_literal] = STATE(26), - [sym_backtick_quoted_literal] = STATE(26), + [sym_double_quoted_literal] = STATE(24), + [sym_backtick_quoted_literal] = STATE(24), [sym_temporal_literal] = STATE(25), [sym_function_name] = ACTIONS(3), [anon_sym_LBRACE] = ACTIONS(5), @@ -1383,45 +1408,110 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { [sym_date_time_literal] = ACTIONS(21), [sym_time_literal] = ACTIONS(21), }, - [STATE(2)] = { - [sym_value] = STATE(40), - [sym_array_literal] = STATE(25), - [sym_tuple_literal] = STATE(25), - [sym_record_literal] = STATE(25), - [sym_record_field] = STATE(42), - [sym_record_field_name] = STATE(72), - [sym_record_access] = STATE(25), - [sym_record_field_selector] = STATE(9), - [sym_boolean_literal] = STATE(25), - [sym_quoted_literal] = STATE(25), - [sym_double_quoted_literal] = STATE(44), - [sym_backtick_quoted_literal] = STATE(44), - [sym_temporal_literal] = STATE(25), - [anon_sym_LBRACE] = ACTIONS(5), - [anon_sym_RBRACE] = ACTIONS(23), - [anon_sym_T] = ACTIONS(7), - [anon_sym_COLON] = ACTIONS(25), - [sym_unquoted_record_field_name] = ACTIONS(27), - [sym_numeric_literal] = ACTIONS(9), - [sym_variable] = ACTIONS(9), - [sym_original_input] = ACTIONS(11), - [sym_named_record_field] = ACTIONS(13), - [sym_positional_record_field] = ACTIONS(13), - [sym_positional_element_access] = ACTIONS(9), - [anon_sym_POUNDtrue] = ACTIONS(15), - [anon_sym_POUNDfalse] = ACTIONS(15), - [anon_sym_DQUOTE] = ACTIONS(17), - [anon_sym_BQUOTE] = ACTIONS(19), - [sym_date_literal] = ACTIONS(21), - [sym_date_time_literal] = ACTIONS(21), - [sym_time_literal] = ACTIONS(21), - }, }; static const uint16_t ts_small_parse_table[] = { - [0] = 16, + [0] = 18, + ACTIONS(5), 1, + anon_sym_LBRACE, + ACTIONS(7), 1, + anon_sym_T, + ACTIONS(11), 1, + sym_original_input, + ACTIONS(17), 1, + anon_sym_DQUOTE, + ACTIONS(19), 1, + anon_sym_BQUOTE, + ACTIONS(23), 1, + anon_sym_RBRACE, + ACTIONS(25), 1, + anon_sym_COLON, + ACTIONS(27), 1, + sym_unquoted_record_field_name, + STATE(10), 1, + sym_record_field_selector, + STATE(59), 1, + sym_value, + STATE(65), 1, + sym_record_field, + STATE(74), 1, + sym_record_field_name, + ACTIONS(13), 2, + sym_named_record_field, + sym_positional_record_field, + ACTIONS(15), 2, + anon_sym_POUNDtrue, + anon_sym_POUNDfalse, + STATE(38), 2, + sym_double_quoted_literal, + sym_backtick_quoted_literal, + ACTIONS(9), 3, + sym_numeric_literal, + sym_variable, + sym_positional_element_access, + ACTIONS(21), 3, + sym_date_literal, + sym_date_time_literal, + sym_time_literal, + STATE(25), 7, + sym_array_literal, + sym_tuple_literal, + sym_record_literal, + sym_record_access, + sym_boolean_literal, + sym_quoted_literal, + sym_temporal_literal, + [68] = 18, ACTIONS(5), 1, anon_sym_LBRACE, + ACTIONS(7), 1, + anon_sym_T, + ACTIONS(11), 1, + sym_original_input, + ACTIONS(17), 1, + anon_sym_DQUOTE, + ACTIONS(19), 1, + anon_sym_BQUOTE, + ACTIONS(23), 1, + anon_sym_RBRACE, + ACTIONS(25), 1, + anon_sym_COLON, + ACTIONS(27), 1, + sym_unquoted_record_field_name, + STATE(10), 1, + sym_record_field_selector, + STATE(40), 1, + sym_value, + STATE(65), 1, + sym_record_field, + STATE(74), 1, + sym_record_field_name, + ACTIONS(13), 2, + sym_named_record_field, + sym_positional_record_field, + ACTIONS(15), 2, + anon_sym_POUNDtrue, + anon_sym_POUNDfalse, + STATE(38), 2, + sym_double_quoted_literal, + sym_backtick_quoted_literal, + ACTIONS(9), 3, + sym_numeric_literal, + sym_variable, + sym_positional_element_access, + ACTIONS(21), 3, + sym_date_literal, + sym_date_time_literal, + sym_time_literal, + STATE(25), 7, + sym_array_literal, + sym_tuple_literal, + sym_record_literal, + sym_record_access, + sym_boolean_literal, + sym_quoted_literal, + sym_temporal_literal, + [136] = 16, ACTIONS(11), 1, sym_original_input, ACTIONS(17), 1, @@ -1431,14 +1521,14 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(29), 1, anon_sym_RPAREN, ACTIONS(31), 1, + anon_sym_LBRACE, + ACTIONS(33), 1, anon_sym_T, - STATE(9), 1, + STATE(10), 1, sym_record_field_selector, - STATE(38), 1, + STATE(61), 1, sym_positional_argument, - STATE(64), 1, - sym_value, - STATE(69), 1, + STATE(73), 1, sym_argument_list, ACTIONS(13), 2, sym_named_record_field, @@ -1446,9 +1536,12 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(15), 2, anon_sym_POUNDtrue, anon_sym_POUNDfalse, - STATE(26), 2, + STATE(24), 2, sym_double_quoted_literal, sym_backtick_quoted_literal, + STATE(66), 2, + sym_parameterized_expression, + sym_value, ACTIONS(9), 3, sym_numeric_literal, sym_variable, @@ -1465,9 +1558,7 @@ static const uint16_t ts_small_parse_table[] = { sym_boolean_literal, sym_quoted_literal, sym_temporal_literal, - [62] = 14, - ACTIONS(5), 1, - anon_sym_LBRACE, + [199] = 14, ACTIONS(11), 1, sym_original_input, ACTIONS(17), 1, @@ -1475,12 +1566,12 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(19), 1, anon_sym_BQUOTE, ACTIONS(31), 1, + anon_sym_LBRACE, + ACTIONS(33), 1, anon_sym_T, - STATE(9), 1, + STATE(10), 1, sym_record_field_selector, - STATE(64), 1, - sym_value, - STATE(67), 1, + STATE(70), 1, sym_positional_argument, ACTIONS(13), 2, sym_named_record_field, @@ -1488,9 +1579,12 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(15), 2, anon_sym_POUNDtrue, anon_sym_POUNDfalse, - STATE(26), 2, + STATE(24), 2, sym_double_quoted_literal, sym_backtick_quoted_literal, + STATE(66), 2, + sym_parameterized_expression, + sym_value, ACTIONS(9), 3, sym_numeric_literal, sym_variable, @@ -1507,7 +1601,7 @@ static const uint16_t ts_small_parse_table[] = { sym_boolean_literal, sym_quoted_literal, sym_temporal_literal, - [118] = 13, + [256] = 13, ACTIONS(5), 1, anon_sym_LBRACE, ACTIONS(11), 1, @@ -1516,11 +1610,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DQUOTE, ACTIONS(19), 1, anon_sym_BQUOTE, - ACTIONS(31), 1, + ACTIONS(33), 1, anon_sym_T, - STATE(9), 1, + STATE(10), 1, sym_record_field_selector, - STATE(77), 1, + STATE(80), 1, sym_value, ACTIONS(13), 2, sym_named_record_field, @@ -1528,7 +1622,7 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(15), 2, anon_sym_POUNDtrue, anon_sym_POUNDfalse, - STATE(26), 2, + STATE(24), 2, sym_double_quoted_literal, sym_backtick_quoted_literal, ACTIONS(9), 3, @@ -1547,7 +1641,7 @@ static const uint16_t ts_small_parse_table[] = { sym_boolean_literal, sym_quoted_literal, sym_temporal_literal, - [171] = 13, + [309] = 13, ACTIONS(5), 1, anon_sym_LBRACE, ACTIONS(11), 1, @@ -1556,11 +1650,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DQUOTE, ACTIONS(19), 1, anon_sym_BQUOTE, - ACTIONS(31), 1, + ACTIONS(33), 1, anon_sym_T, - STATE(9), 1, + STATE(10), 1, sym_record_field_selector, - STATE(49), 1, + STATE(67), 1, sym_value, ACTIONS(13), 2, sym_named_record_field, @@ -1568,7 +1662,7 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(15), 2, anon_sym_POUNDtrue, anon_sym_POUNDfalse, - STATE(26), 2, + STATE(24), 2, sym_double_quoted_literal, sym_backtick_quoted_literal, ACTIONS(9), 3, @@ -1587,7 +1681,7 @@ static const uint16_t ts_small_parse_table[] = { sym_boolean_literal, sym_quoted_literal, sym_temporal_literal, - [224] = 13, + [362] = 13, ACTIONS(5), 1, anon_sym_LBRACE, ACTIONS(11), 1, @@ -1596,11 +1690,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DQUOTE, ACTIONS(19), 1, anon_sym_BQUOTE, - ACTIONS(31), 1, + ACTIONS(33), 1, anon_sym_T, - STATE(9), 1, + STATE(10), 1, sym_record_field_selector, - STATE(66), 1, + STATE(57), 1, sym_value, ACTIONS(13), 2, sym_named_record_field, @@ -1608,7 +1702,7 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(15), 2, anon_sym_POUNDtrue, anon_sym_POUNDfalse, - STATE(26), 2, + STATE(24), 2, sym_double_quoted_literal, sym_backtick_quoted_literal, ACTIONS(9), 3, @@ -1627,7 +1721,7 @@ static const uint16_t ts_small_parse_table[] = { sym_boolean_literal, sym_quoted_literal, sym_temporal_literal, - [277] = 13, + [415] = 13, ACTIONS(5), 1, anon_sym_LBRACE, ACTIONS(11), 1, @@ -1636,11 +1730,11 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_DQUOTE, ACTIONS(19), 1, anon_sym_BQUOTE, - ACTIONS(31), 1, + ACTIONS(33), 1, anon_sym_T, - STATE(9), 1, + STATE(10), 1, sym_record_field_selector, - STATE(55), 1, + STATE(64), 1, sym_value, ACTIONS(13), 2, sym_named_record_field, @@ -1648,7 +1742,7 @@ static const uint16_t ts_small_parse_table[] = { ACTIONS(15), 2, anon_sym_POUNDtrue, anon_sym_POUNDfalse, - STATE(26), 2, + STATE(24), 2, sym_double_quoted_literal, sym_backtick_quoted_literal, ACTIONS(9), 3, @@ -1667,78 +1761,78 @@ static const uint16_t ts_small_parse_table[] = { sym_boolean_literal, sym_quoted_literal, sym_temporal_literal, - [330] = 4, + [468] = 4, STATE(11), 1, aux_sym_record_access_repeat1, - STATE(17), 1, + STATE(16), 1, sym_immediate_record_field_selector, - ACTIONS(35), 2, + ACTIONS(37), 2, aux_sym_immediate_record_field_selector_token1, aux_sym_immediate_record_field_selector_token2, - ACTIONS(33), 5, + ACTIONS(35), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [348] = 4, - STATE(12), 1, + [486] = 4, + STATE(14), 1, aux_sym_record_access_repeat1, - STATE(17), 1, + STATE(16), 1, sym_immediate_record_field_selector, - ACTIONS(35), 2, + ACTIONS(37), 2, aux_sym_immediate_record_field_selector_token1, aux_sym_immediate_record_field_selector_token2, - ACTIONS(37), 5, + ACTIONS(39), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [366] = 4, + [504] = 4, STATE(13), 1, aux_sym_record_access_repeat1, - STATE(17), 1, + STATE(16), 1, sym_immediate_record_field_selector, - ACTIONS(35), 2, + ACTIONS(37), 2, aux_sym_immediate_record_field_selector_token1, aux_sym_immediate_record_field_selector_token2, - ACTIONS(39), 5, + ACTIONS(41), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [384] = 4, - STATE(13), 1, + [522] = 4, + STATE(14), 1, aux_sym_record_access_repeat1, - STATE(17), 1, + STATE(16), 1, sym_immediate_record_field_selector, - ACTIONS(35), 2, + ACTIONS(37), 2, aux_sym_immediate_record_field_selector_token1, aux_sym_immediate_record_field_selector_token2, - ACTIONS(41), 5, + ACTIONS(43), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [402] = 4, - STATE(13), 1, + [540] = 4, + STATE(14), 1, aux_sym_record_access_repeat1, - STATE(17), 1, + STATE(16), 1, sym_immediate_record_field_selector, - ACTIONS(45), 2, + ACTIONS(47), 2, aux_sym_immediate_record_field_selector_token1, aux_sym_immediate_record_field_selector_token2, - ACTIONS(43), 5, + ACTIONS(45), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [420] = 1, - ACTIONS(48), 7, + [558] = 1, + ACTIONS(50), 7, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, @@ -1746,8 +1840,8 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RBRACE, aux_sym_immediate_record_field_selector_token1, aux_sym_immediate_record_field_selector_token2, - [430] = 1, - ACTIONS(50), 7, + [568] = 1, + ACTIONS(52), 7, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, @@ -1755,8 +1849,8 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RBRACE, aux_sym_immediate_record_field_selector_token1, aux_sym_immediate_record_field_selector_token2, - [440] = 1, - ACTIONS(52), 7, + [578] = 1, + ACTIONS(54), 7, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, @@ -1764,8 +1858,8 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RBRACE, aux_sym_immediate_record_field_selector_token1, aux_sym_immediate_record_field_selector_token2, - [450] = 1, - ACTIONS(54), 7, + [588] = 1, + ACTIONS(56), 7, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, @@ -1773,29 +1867,21 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_RBRACE, aux_sym_immediate_record_field_selector_token1, aux_sym_immediate_record_field_selector_token2, - [460] = 6, + [598] = 6, ACTIONS(17), 1, anon_sym_DQUOTE, ACTIONS(19), 1, anon_sym_BQUOTE, - ACTIONS(56), 1, + ACTIONS(58), 1, sym_unquoted_record_field_name, - STATE(63), 1, + STATE(69), 1, sym_record_field, - STATE(72), 1, + STATE(74), 1, sym_record_field_name, - STATE(78), 2, + STATE(77), 2, sym_double_quoted_literal, sym_backtick_quoted_literal, - [480] = 1, - ACTIONS(58), 6, - ts_builtin_sym_end, - anon_sym_PIPE, - anon_sym_RPAREN, - anon_sym_COMMA, - anon_sym_RBRACE, - anon_sym_COLON_EQ, - [489] = 1, + [618] = 1, ACTIONS(60), 6, ts_builtin_sym_end, anon_sym_PIPE, @@ -1803,7 +1889,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_COMMA, anon_sym_RBRACE, anon_sym_COLON_EQ, - [498] = 1, + [627] = 1, ACTIONS(62), 6, ts_builtin_sym_end, anon_sym_PIPE, @@ -1811,7 +1897,7 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_COMMA, anon_sym_RBRACE, anon_sym_COLON_EQ, - [507] = 1, + [636] = 1, ACTIONS(64), 6, ts_builtin_sym_end, anon_sym_PIPE, @@ -1819,507 +1905,559 @@ static const uint16_t ts_small_parse_table[] = { anon_sym_COMMA, anon_sym_RBRACE, anon_sym_COLON_EQ, - [516] = 1, - ACTIONS(66), 5, + [645] = 1, + ACTIONS(66), 6, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [524] = 1, + anon_sym_COLON_EQ, + [654] = 1, ACTIONS(68), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [532] = 1, + [662] = 1, ACTIONS(70), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [540] = 1, + [670] = 1, ACTIONS(72), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [548] = 1, + [678] = 1, ACTIONS(74), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [556] = 1, + [686] = 1, ACTIONS(76), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [564] = 1, + [694] = 1, ACTIONS(78), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [572] = 1, + [702] = 1, ACTIONS(80), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [580] = 1, + [710] = 1, ACTIONS(82), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [588] = 1, + [718] = 1, ACTIONS(84), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [596] = 1, + [726] = 1, ACTIONS(86), 5, ts_builtin_sym_end, anon_sym_PIPE, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [604] = 3, - ACTIONS(88), 1, - anon_sym_DQUOTE, - STATE(35), 1, - aux_sym_double_quoted_literal_repeat1, - ACTIONS(90), 2, - sym_double_quoted_content, - sym_escape_sequence, - [615] = 3, + [734] = 1, + ACTIONS(88), 5, + ts_builtin_sym_end, + anon_sym_PIPE, + anon_sym_RPAREN, + anon_sym_COMMA, + anon_sym_RBRACE, + [742] = 2, ACTIONS(92), 1, + anon_sym_LPAREN, + ACTIONS(90), 3, + ts_builtin_sym_end, + anon_sym_PIPE, + anon_sym_RBRACE, + [751] = 3, + ACTIONS(96), 1, + anon_sym_PIPE, + STATE(41), 1, + aux_sym_open_expression_repeat1, + ACTIONS(94), 2, + ts_builtin_sym_end, + anon_sym_RBRACE, + [762] = 3, + ACTIONS(98), 1, anon_sym_DQUOTE, - STATE(35), 1, + STATE(43), 1, aux_sym_double_quoted_literal_repeat1, - ACTIONS(94), 2, + ACTIONS(100), 2, sym_double_quoted_content, sym_escape_sequence, - [626] = 3, - ACTIONS(97), 1, + [773] = 2, + ACTIONS(102), 1, + anon_sym_COLON_EQ, + ACTIONS(68), 3, + anon_sym_PIPE, + anon_sym_COMMA, + anon_sym_RBRACE, + [782] = 3, + ACTIONS(104), 1, anon_sym_DQUOTE, - STATE(34), 1, + STATE(37), 1, aux_sym_double_quoted_literal_repeat1, - ACTIONS(99), 2, + ACTIONS(106), 2, sym_double_quoted_content, sym_escape_sequence, - [637] = 3, - ACTIONS(103), 1, + [793] = 4, + ACTIONS(108), 1, + anon_sym_PIPE, + ACTIONS(110), 1, anon_sym_COMMA, - STATE(37), 1, + ACTIONS(112), 1, + anon_sym_RBRACE, + STATE(48), 1, aux_sym_array_literal_repeat1, - ACTIONS(101), 2, - anon_sym_RPAREN, + [806] = 3, + ACTIONS(116), 1, + anon_sym_PIPE, + STATE(41), 1, + aux_sym_open_expression_repeat1, + ACTIONS(114), 2, + ts_builtin_sym_end, anon_sym_RBRACE, - [648] = 3, - ACTIONS(106), 1, - anon_sym_RPAREN, - ACTIONS(108), 1, + [817] = 3, + ACTIONS(121), 1, anon_sym_COMMA, - STATE(48), 1, - aux_sym_argument_list_repeat1, - [658] = 2, - ACTIONS(112), 1, - anon_sym_LPAREN, - ACTIONS(110), 2, + STATE(42), 1, + aux_sym_array_literal_repeat1, + ACTIONS(119), 2, + anon_sym_RPAREN, + anon_sym_RBRACE, + [828] = 3, + ACTIONS(124), 1, + anon_sym_DQUOTE, + STATE(43), 1, + aux_sym_double_quoted_literal_repeat1, + ACTIONS(126), 2, + sym_double_quoted_content, + sym_escape_sequence, + [839] = 3, + ACTIONS(96), 1, + anon_sym_PIPE, + STATE(36), 1, + aux_sym_open_expression_repeat1, + ACTIONS(129), 2, + ts_builtin_sym_end, + anon_sym_RBRACE, + [850] = 4, + ACTIONS(131), 1, + sym_function_name, + STATE(44), 1, + sym_expression, + STATE(46), 1, + sym_function_call, + STATE(81), 1, + sym_open_expression, + [863] = 1, + ACTIONS(133), 3, ts_builtin_sym_end, anon_sym_PIPE, - [666] = 3, - ACTIONS(114), 1, - anon_sym_COMMA, - ACTIONS(116), 1, anon_sym_RBRACE, - STATE(41), 1, - aux_sym_array_literal_repeat1, - [676] = 3, - ACTIONS(114), 1, + [869] = 3, + ACTIONS(110), 1, anon_sym_COMMA, - ACTIONS(118), 1, - anon_sym_RBRACE, - STATE(37), 1, + ACTIONS(135), 1, + anon_sym_RPAREN, + STATE(42), 1, aux_sym_array_literal_repeat1, - [686] = 3, - ACTIONS(120), 1, + [879] = 3, + ACTIONS(110), 1, anon_sym_COMMA, - ACTIONS(122), 1, + ACTIONS(137), 1, anon_sym_RBRACE, - STATE(43), 1, - aux_sym_record_literal_repeat1, - [696] = 3, - ACTIONS(120), 1, + STATE(42), 1, + aux_sym_array_literal_repeat1, + [889] = 3, + ACTIONS(139), 1, anon_sym_COMMA, - ACTIONS(124), 1, + ACTIONS(141), 1, anon_sym_RBRACE, - STATE(51), 1, + STATE(60), 1, aux_sym_record_literal_repeat1, - [706] = 2, - ACTIONS(126), 1, - anon_sym_COLON_EQ, - ACTIONS(72), 2, - anon_sym_COMMA, - anon_sym_RBRACE, - [714] = 3, - ACTIONS(128), 1, - ts_builtin_sym_end, - ACTIONS(130), 1, - anon_sym_PIPE, - STATE(45), 1, - aux_sym_open_expression_repeat1, - [724] = 2, - STATE(10), 1, + [899] = 3, + ACTIONS(131), 1, + sym_function_name, + STATE(46), 1, + sym_function_call, + STATE(53), 1, + sym_expression, + [909] = 3, + ACTIONS(131), 1, + sym_function_name, + STATE(46), 1, + sym_function_call, + STATE(54), 1, + sym_expression, + [919] = 2, + STATE(12), 1, sym_original_record_field_selector, - ACTIONS(133), 2, + ACTIONS(143), 2, aux_sym_original_record_field_selector_token1, aux_sym_original_record_field_selector_token2, - [732] = 3, - ACTIONS(135), 1, + [927] = 1, + ACTIONS(114), 3, ts_builtin_sym_end, - ACTIONS(137), 1, anon_sym_PIPE, - STATE(52), 1, + anon_sym_RBRACE, + [933] = 3, + ACTIONS(96), 1, + anon_sym_PIPE, + ACTIONS(145), 1, + ts_builtin_sym_end, + STATE(62), 1, aux_sym_open_expression_repeat1, - [742] = 3, - ACTIONS(108), 1, - anon_sym_COMMA, - ACTIONS(139), 1, + [943] = 1, + ACTIONS(147), 3, + ts_builtin_sym_end, + anon_sym_PIPE, + anon_sym_RBRACE, + [949] = 3, + ACTIONS(149), 1, anon_sym_RPAREN, - STATE(54), 1, + ACTIONS(151), 1, + anon_sym_COMMA, + STATE(63), 1, aux_sym_argument_list_repeat1, - [752] = 1, - ACTIONS(101), 3, + [959] = 1, + ACTIONS(119), 3, anon_sym_RPAREN, anon_sym_COMMA, anon_sym_RBRACE, - [758] = 3, - ACTIONS(141), 1, - sym_function_name, - STATE(60), 1, - sym_function_call, - STATE(65), 1, - sym_expression, - [768] = 3, - ACTIONS(143), 1, + [965] = 1, + ACTIONS(153), 3, + ts_builtin_sym_end, + anon_sym_PIPE, + anon_sym_RBRACE, + [971] = 3, + ACTIONS(110), 1, + anon_sym_COMMA, + ACTIONS(112), 1, + anon_sym_RBRACE, + STATE(48), 1, + aux_sym_array_literal_repeat1, + [981] = 3, + ACTIONS(155), 1, anon_sym_COMMA, - ACTIONS(146), 1, + ACTIONS(158), 1, anon_sym_RBRACE, - STATE(51), 1, + STATE(60), 1, aux_sym_record_literal_repeat1, - [778] = 3, - ACTIONS(137), 1, - anon_sym_PIPE, - ACTIONS(148), 1, - ts_builtin_sym_end, - STATE(45), 1, - aux_sym_open_expression_repeat1, - [788] = 3, - ACTIONS(137), 1, + [991] = 3, + ACTIONS(151), 1, + anon_sym_COMMA, + ACTIONS(160), 1, + anon_sym_RPAREN, + STATE(56), 1, + aux_sym_argument_list_repeat1, + [1001] = 3, + ACTIONS(96), 1, anon_sym_PIPE, - ACTIONS(150), 1, + ACTIONS(162), 1, ts_builtin_sym_end, - STATE(45), 1, + STATE(41), 1, aux_sym_open_expression_repeat1, - [798] = 3, - ACTIONS(152), 1, + [1011] = 3, + ACTIONS(164), 1, anon_sym_RPAREN, - ACTIONS(154), 1, + ACTIONS(166), 1, anon_sym_COMMA, - STATE(54), 1, + STATE(63), 1, aux_sym_argument_list_repeat1, - [808] = 3, - ACTIONS(114), 1, + [1021] = 3, + ACTIONS(110), 1, anon_sym_COMMA, - ACTIONS(157), 1, + ACTIONS(169), 1, anon_sym_RPAREN, - STATE(57), 1, + STATE(47), 1, aux_sym_array_literal_repeat1, - [818] = 3, - ACTIONS(141), 1, - sym_function_name, - STATE(58), 1, - sym_expression, - STATE(60), 1, - sym_function_call, - [828] = 3, - ACTIONS(114), 1, + [1031] = 3, + ACTIONS(139), 1, anon_sym_COMMA, - ACTIONS(159), 1, - anon_sym_RPAREN, - STATE(37), 1, - aux_sym_array_literal_repeat1, - [838] = 3, - ACTIONS(137), 1, - anon_sym_PIPE, - ACTIONS(161), 1, - ts_builtin_sym_end, - STATE(53), 1, - aux_sym_open_expression_repeat1, - [848] = 2, - ACTIONS(163), 1, - anon_sym_BQUOTE, - ACTIONS(165), 1, - sym_backtick_quoted_content, - [855] = 1, - ACTIONS(167), 2, - ts_builtin_sym_end, - anon_sym_PIPE, - [860] = 1, - ACTIONS(169), 2, - ts_builtin_sym_end, - anon_sym_PIPE, - [865] = 2, ACTIONS(171), 1, - ts_builtin_sym_end, - ACTIONS(173), 1, - anon_sym_PIPE, - [872] = 1, - ACTIONS(146), 2, - anon_sym_COMMA, anon_sym_RBRACE, - [877] = 1, - ACTIONS(175), 2, + STATE(49), 1, + aux_sym_record_literal_repeat1, + [1041] = 1, + ACTIONS(173), 2, anon_sym_RPAREN, anon_sym_COMMA, - [882] = 1, - ACTIONS(128), 2, + [1046] = 1, + ACTIONS(175), 2, + anon_sym_COMMA, + anon_sym_RBRACE, + [1051] = 2, + ACTIONS(177), 1, ts_builtin_sym_end, + ACTIONS(179), 1, anon_sym_PIPE, - [887] = 1, - ACTIONS(177), 2, + [1058] = 1, + ACTIONS(158), 2, anon_sym_COMMA, anon_sym_RBRACE, - [892] = 1, - ACTIONS(152), 2, + [1063] = 1, + ACTIONS(164), 2, anon_sym_RPAREN, anon_sym_COMMA, - [897] = 1, - ACTIONS(179), 2, - ts_builtin_sym_end, - anon_sym_PIPE, - [902] = 1, - ACTIONS(181), 1, + [1068] = 1, + ACTIONS(181), 2, anon_sym_RPAREN, - [906] = 1, + anon_sym_COMMA, + [1073] = 2, ACTIONS(183), 1, anon_sym_BQUOTE, - [910] = 1, ACTIONS(185), 1, - anon_sym_LPAREN, - [914] = 1, + sym_backtick_quoted_content, + [1080] = 1, ACTIONS(187), 1, - anon_sym_COLON_EQ, - [918] = 1, + anon_sym_RPAREN, + [1084] = 1, ACTIONS(189), 1, - ts_builtin_sym_end, - [922] = 1, - ACTIONS(122), 1, - anon_sym_RBRACE, - [926] = 1, + anon_sym_COLON_EQ, + [1088] = 1, ACTIONS(191), 1, - ts_builtin_sym_end, - [930] = 1, + anon_sym_LPAREN, + [1092] = 1, ACTIONS(193), 1, ts_builtin_sym_end, - [934] = 1, + [1096] = 1, + ACTIONS(102), 1, + anon_sym_COLON_EQ, + [1100] = 1, ACTIONS(195), 1, + anon_sym_BQUOTE, + [1104] = 1, + ACTIONS(197), 1, + ts_builtin_sym_end, + [1108] = 1, + ACTIONS(199), 1, anon_sym_COMMA, - [938] = 1, - ACTIONS(126), 1, - anon_sym_COLON_EQ, + [1112] = 1, + ACTIONS(201), 1, + anon_sym_RBRACE, + [1116] = 1, + ACTIONS(203), 1, + ts_builtin_sym_end, + [1120] = 1, + ACTIONS(171), 1, + anon_sym_RBRACE, }; static const uint32_t ts_small_parse_table_map[] = { - [SMALL_STATE(3)] = 0, - [SMALL_STATE(4)] = 62, - [SMALL_STATE(5)] = 118, - [SMALL_STATE(6)] = 171, - [SMALL_STATE(7)] = 224, - [SMALL_STATE(8)] = 277, - [SMALL_STATE(9)] = 330, - [SMALL_STATE(10)] = 348, - [SMALL_STATE(11)] = 366, - [SMALL_STATE(12)] = 384, - [SMALL_STATE(13)] = 402, - [SMALL_STATE(14)] = 420, - [SMALL_STATE(15)] = 430, - [SMALL_STATE(16)] = 440, - [SMALL_STATE(17)] = 450, - [SMALL_STATE(18)] = 460, - [SMALL_STATE(19)] = 480, - [SMALL_STATE(20)] = 489, - [SMALL_STATE(21)] = 498, - [SMALL_STATE(22)] = 507, - [SMALL_STATE(23)] = 516, - [SMALL_STATE(24)] = 524, - [SMALL_STATE(25)] = 532, - [SMALL_STATE(26)] = 540, - [SMALL_STATE(27)] = 548, - [SMALL_STATE(28)] = 556, - [SMALL_STATE(29)] = 564, - [SMALL_STATE(30)] = 572, - [SMALL_STATE(31)] = 580, - [SMALL_STATE(32)] = 588, - [SMALL_STATE(33)] = 596, - [SMALL_STATE(34)] = 604, - [SMALL_STATE(35)] = 615, - [SMALL_STATE(36)] = 626, - [SMALL_STATE(37)] = 637, - [SMALL_STATE(38)] = 648, - [SMALL_STATE(39)] = 658, - [SMALL_STATE(40)] = 666, - [SMALL_STATE(41)] = 676, - [SMALL_STATE(42)] = 686, - [SMALL_STATE(43)] = 696, - [SMALL_STATE(44)] = 706, - [SMALL_STATE(45)] = 714, - [SMALL_STATE(46)] = 724, - [SMALL_STATE(47)] = 732, - [SMALL_STATE(48)] = 742, - [SMALL_STATE(49)] = 752, - [SMALL_STATE(50)] = 758, - [SMALL_STATE(51)] = 768, - [SMALL_STATE(52)] = 778, - [SMALL_STATE(53)] = 788, - [SMALL_STATE(54)] = 798, - [SMALL_STATE(55)] = 808, - [SMALL_STATE(56)] = 818, - [SMALL_STATE(57)] = 828, - [SMALL_STATE(58)] = 838, - [SMALL_STATE(59)] = 848, - [SMALL_STATE(60)] = 855, - [SMALL_STATE(61)] = 860, - [SMALL_STATE(62)] = 865, - [SMALL_STATE(63)] = 872, - [SMALL_STATE(64)] = 877, - [SMALL_STATE(65)] = 882, - [SMALL_STATE(66)] = 887, - [SMALL_STATE(67)] = 892, - [SMALL_STATE(68)] = 897, - [SMALL_STATE(69)] = 902, - [SMALL_STATE(70)] = 906, - [SMALL_STATE(71)] = 910, - [SMALL_STATE(72)] = 914, - [SMALL_STATE(73)] = 918, - [SMALL_STATE(74)] = 922, - [SMALL_STATE(75)] = 926, - [SMALL_STATE(76)] = 930, - [SMALL_STATE(77)] = 934, - [SMALL_STATE(78)] = 938, + [SMALL_STATE(2)] = 0, + [SMALL_STATE(3)] = 68, + [SMALL_STATE(4)] = 136, + [SMALL_STATE(5)] = 199, + [SMALL_STATE(6)] = 256, + [SMALL_STATE(7)] = 309, + [SMALL_STATE(8)] = 362, + [SMALL_STATE(9)] = 415, + [SMALL_STATE(10)] = 468, + [SMALL_STATE(11)] = 486, + [SMALL_STATE(12)] = 504, + [SMALL_STATE(13)] = 522, + [SMALL_STATE(14)] = 540, + [SMALL_STATE(15)] = 558, + [SMALL_STATE(16)] = 568, + [SMALL_STATE(17)] = 578, + [SMALL_STATE(18)] = 588, + [SMALL_STATE(19)] = 598, + [SMALL_STATE(20)] = 618, + [SMALL_STATE(21)] = 627, + [SMALL_STATE(22)] = 636, + [SMALL_STATE(23)] = 645, + [SMALL_STATE(24)] = 654, + [SMALL_STATE(25)] = 662, + [SMALL_STATE(26)] = 670, + [SMALL_STATE(27)] = 678, + [SMALL_STATE(28)] = 686, + [SMALL_STATE(29)] = 694, + [SMALL_STATE(30)] = 702, + [SMALL_STATE(31)] = 710, + [SMALL_STATE(32)] = 718, + [SMALL_STATE(33)] = 726, + [SMALL_STATE(34)] = 734, + [SMALL_STATE(35)] = 742, + [SMALL_STATE(36)] = 751, + [SMALL_STATE(37)] = 762, + [SMALL_STATE(38)] = 773, + [SMALL_STATE(39)] = 782, + [SMALL_STATE(40)] = 793, + [SMALL_STATE(41)] = 806, + [SMALL_STATE(42)] = 817, + [SMALL_STATE(43)] = 828, + [SMALL_STATE(44)] = 839, + [SMALL_STATE(45)] = 850, + [SMALL_STATE(46)] = 863, + [SMALL_STATE(47)] = 869, + [SMALL_STATE(48)] = 879, + [SMALL_STATE(49)] = 889, + [SMALL_STATE(50)] = 899, + [SMALL_STATE(51)] = 909, + [SMALL_STATE(52)] = 919, + [SMALL_STATE(53)] = 927, + [SMALL_STATE(54)] = 933, + [SMALL_STATE(55)] = 943, + [SMALL_STATE(56)] = 949, + [SMALL_STATE(57)] = 959, + [SMALL_STATE(58)] = 965, + [SMALL_STATE(59)] = 971, + [SMALL_STATE(60)] = 981, + [SMALL_STATE(61)] = 991, + [SMALL_STATE(62)] = 1001, + [SMALL_STATE(63)] = 1011, + [SMALL_STATE(64)] = 1021, + [SMALL_STATE(65)] = 1031, + [SMALL_STATE(66)] = 1041, + [SMALL_STATE(67)] = 1046, + [SMALL_STATE(68)] = 1051, + [SMALL_STATE(69)] = 1058, + [SMALL_STATE(70)] = 1063, + [SMALL_STATE(71)] = 1068, + [SMALL_STATE(72)] = 1073, + [SMALL_STATE(73)] = 1080, + [SMALL_STATE(74)] = 1084, + [SMALL_STATE(75)] = 1088, + [SMALL_STATE(76)] = 1092, + [SMALL_STATE(77)] = 1096, + [SMALL_STATE(78)] = 1100, + [SMALL_STATE(79)] = 1104, + [SMALL_STATE(80)] = 1108, + [SMALL_STATE(81)] = 1112, + [SMALL_STATE(82)] = 1116, + [SMALL_STATE(83)] = 1120, }; static const TSParseActionEntry ts_parse_actions[] = { [0] = {.entry = {.count = 0, .reusable = false}}, [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), - [3] = {.entry = {.count = 1, .reusable = false}}, SHIFT(39), + [3] = {.entry = {.count = 1, .reusable = false}}, SHIFT(35), [5] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), - [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(71), + [7] = {.entry = {.count = 1, .reusable = false}}, SHIFT(75), [9] = {.entry = {.count = 1, .reusable = true}}, SHIFT(25), - [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(46), + [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(52), [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(15), [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(28), - [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(36), - [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(59), - [21] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23), - [23] = {.entry = {.count = 1, .reusable = true}}, SHIFT(29), - [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(74), - [27] = {.entry = {.count = 1, .reusable = false}}, SHIFT(78), - [29] = {.entry = {.count = 1, .reusable = true}}, SHIFT(68), - [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(71), - [33] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_access, 1, 0, 2), - [35] = {.entry = {.count = 1, .reusable = true}}, SHIFT(16), - [37] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_access, 2, 0, 3), + [17] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), + [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(72), + [21] = {.entry = {.count = 1, .reusable = true}}, SHIFT(29), + [23] = {.entry = {.count = 1, .reusable = true}}, SHIFT(26), + [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(83), + [27] = {.entry = {.count = 1, .reusable = false}}, SHIFT(77), + [29] = {.entry = {.count = 1, .reusable = true}}, SHIFT(58), + [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), + [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(75), + [35] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_access, 1, 0, 2), + [37] = {.entry = {.count = 1, .reusable = true}}, SHIFT(18), [39] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_access, 2, 0, 4), - [41] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_access, 3, 0, 5), - [43] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_record_access_repeat1, 2, 0, 6), - [45] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_record_access_repeat1, 2, 0, 6), SHIFT_REPEAT(16), - [48] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_original_record_field_selector, 1, 0, 0), + [41] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_access, 2, 0, 3), + [43] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_access, 3, 0, 5), + [45] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_record_access_repeat1, 2, 0, 6), + [47] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_record_access_repeat1, 2, 0, 6), SHIFT_REPEAT(18), [50] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_field_selector, 1, 0, 0), - [52] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_immediate_record_field_selector, 1, 0, 0), - [54] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_record_access_repeat1, 1, 0, 2), - [56] = {.entry = {.count = 1, .reusable = true}}, SHIFT(78), - [58] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_backtick_quoted_literal, 2, 0, 0), - [60] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double_quoted_literal, 2, 0, 0), - [62] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double_quoted_literal, 3, 0, 0), - [64] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_backtick_quoted_literal, 3, 0, 0), - [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_temporal_literal, 1, 0, 0), - [68] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_literal, 3, 0, 0), + [52] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_record_access_repeat1, 1, 0, 2), + [54] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_original_record_field_selector, 1, 0, 0), + [56] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_immediate_record_field_selector, 1, 0, 0), + [58] = {.entry = {.count = 1, .reusable = true}}, SHIFT(77), + [60] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_backtick_quoted_literal, 2, 0, 0), + [62] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double_quoted_literal, 2, 0, 0), + [64] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_double_quoted_literal, 3, 0, 0), + [66] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_backtick_quoted_literal, 3, 0, 0), + [68] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_quoted_literal, 1, 0, 0), [70] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_value, 1, 0, 0), - [72] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_quoted_literal, 1, 0, 0), - [74] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_literal, 3, 0, 0), + [72] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_literal, 2, 0, 0), + [74] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_literal, 7, 0, 0), [76] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_boolean_literal, 1, 0, 0), - [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_literal, 2, 0, 0), - [80] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_literal, 4, 0, 0), - [82] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_literal, 7, 0, 0), - [84] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_literal, 4, 0, 0), - [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_literal, 6, 0, 0), - [88] = {.entry = {.count = 1, .reusable = false}}, SHIFT(21), - [90] = {.entry = {.count = 1, .reusable = true}}, SHIFT(35), - [92] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_double_quoted_literal_repeat1, 2, 0, 0), - [94] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_double_quoted_literal_repeat1, 2, 0, 0), SHIFT_REPEAT(35), - [97] = {.entry = {.count = 1, .reusable = false}}, SHIFT(20), - [99] = {.entry = {.count = 1, .reusable = true}}, SHIFT(34), - [101] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_array_literal_repeat1, 2, 0, 0), - [103] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_array_literal_repeat1, 2, 0, 0), SHIFT_REPEAT(6), - [106] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_argument_list, 1, 0, 0), - [108] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), - [110] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_call, 1, 0, 1), - [112] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), - [114] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), - [116] = {.entry = {.count = 1, .reusable = true}}, SHIFT(24), - [118] = {.entry = {.count = 1, .reusable = true}}, SHIFT(30), - [120] = {.entry = {.count = 1, .reusable = true}}, SHIFT(18), - [122] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), - [124] = {.entry = {.count = 1, .reusable = true}}, SHIFT(32), - [126] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_field_name, 1, 0, 0), - [128] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_open_expression_repeat1, 2, 0, 0), - [130] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_open_expression_repeat1, 2, 0, 0), SHIFT_REPEAT(50), - [133] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), - [135] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_open_expression, 1, 0, 0), - [137] = {.entry = {.count = 1, .reusable = true}}, SHIFT(50), - [139] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_argument_list, 2, 0, 0), - [141] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), - [143] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_record_literal_repeat1, 2, 0, 0), SHIFT_REPEAT(18), - [146] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_record_literal_repeat1, 2, 0, 0), - [148] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_open_expression, 2, 0, 0), - [150] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_closed_expression, 4, 0, 0), - [152] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_argument_list_repeat1, 2, 0, 0), - [154] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_argument_list_repeat1, 2, 0, 0), SHIFT_REPEAT(4), - [157] = {.entry = {.count = 1, .reusable = true}}, SHIFT(33), - [159] = {.entry = {.count = 1, .reusable = true}}, SHIFT(31), - [161] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_closed_expression, 3, 0, 0), - [163] = {.entry = {.count = 1, .reusable = false}}, SHIFT(19), - [165] = {.entry = {.count = 1, .reusable = true}}, SHIFT(70), - [167] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 0), - [169] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_call, 4, 0, 1), - [171] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_closed_expression, 1, 0, 0), - [173] = {.entry = {.count = 1, .reusable = true}}, SHIFT(56), - [175] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_positional_argument, 1, 0, 0), - [177] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_field, 3, 0, 7), - [179] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_call, 3, 0, 1), - [181] = {.entry = {.count = 1, .reusable = true}}, SHIFT(61), - [183] = {.entry = {.count = 1, .reusable = true}}, SHIFT(22), - [185] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), - [187] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), - [189] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), - [191] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 1, 0, 0), - [193] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_root_expression, 1, 0, 0), - [195] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), + [78] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_temporal_literal, 1, 0, 0), + [80] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_literal, 3, 0, 0), + [82] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_literal, 4, 0, 0), + [84] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_literal, 3, 0, 0), + [86] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_array_literal, 4, 0, 0), + [88] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_literal, 6, 0, 0), + [90] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_call, 1, 0, 1), + [92] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), + [94] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_open_expression, 2, 0, 0), + [96] = {.entry = {.count = 1, .reusable = true}}, SHIFT(50), + [98] = {.entry = {.count = 1, .reusable = false}}, SHIFT(22), + [100] = {.entry = {.count = 1, .reusable = true}}, SHIFT(43), + [102] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_field_name, 1, 0, 0), + [104] = {.entry = {.count = 1, .reusable = false}}, SHIFT(21), + [106] = {.entry = {.count = 1, .reusable = true}}, SHIFT(37), + [108] = {.entry = {.count = 1, .reusable = true}}, SHIFT(45), + [110] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), + [112] = {.entry = {.count = 1, .reusable = true}}, SHIFT(32), + [114] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_open_expression_repeat1, 2, 0, 0), + [116] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_open_expression_repeat1, 2, 0, 0), SHIFT_REPEAT(50), + [119] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_array_literal_repeat1, 2, 0, 0), + [121] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_array_literal_repeat1, 2, 0, 0), SHIFT_REPEAT(8), + [124] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_double_quoted_literal_repeat1, 2, 0, 0), + [126] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_double_quoted_literal_repeat1, 2, 0, 0), SHIFT_REPEAT(43), + [129] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_open_expression, 1, 0, 0), + [131] = {.entry = {.count = 1, .reusable = true}}, SHIFT(35), + [133] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression, 1, 0, 0), + [135] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), + [137] = {.entry = {.count = 1, .reusable = true}}, SHIFT(33), + [139] = {.entry = {.count = 1, .reusable = true}}, SHIFT(19), + [141] = {.entry = {.count = 1, .reusable = true}}, SHIFT(31), + [143] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), + [145] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_closed_expression, 3, 0, 0), + [147] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_call, 4, 0, 1), + [149] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_argument_list, 2, 0, 0), + [151] = {.entry = {.count = 1, .reusable = true}}, SHIFT(5), + [153] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_call, 3, 0, 1), + [155] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_record_literal_repeat1, 2, 0, 0), SHIFT_REPEAT(19), + [158] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_record_literal_repeat1, 2, 0, 0), + [160] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_argument_list, 1, 0, 0), + [162] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_closed_expression, 4, 0, 0), + [164] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_argument_list_repeat1, 2, 0, 0), + [166] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_argument_list_repeat1, 2, 0, 0), SHIFT_REPEAT(5), + [169] = {.entry = {.count = 1, .reusable = true}}, SHIFT(34), + [171] = {.entry = {.count = 1, .reusable = true}}, SHIFT(30), + [173] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_positional_argument, 1, 0, 0), + [175] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_record_field, 3, 0, 7), + [177] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_closed_expression, 1, 0, 0), + [179] = {.entry = {.count = 1, .reusable = true}}, SHIFT(51), + [181] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameterized_expression, 5, 0, 8), + [183] = {.entry = {.count = 1, .reusable = false}}, SHIFT(20), + [185] = {.entry = {.count = 1, .reusable = true}}, SHIFT(78), + [187] = {.entry = {.count = 1, .reusable = true}}, SHIFT(55), + [189] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), + [191] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), + [193] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source_file, 1, 0, 0), + [195] = {.entry = {.count = 1, .reusable = true}}, SHIFT(23), + [197] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_root_expression, 1, 0, 0), + [199] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), + [201] = {.entry = {.count = 1, .reusable = true}}, SHIFT(71), + [203] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), }; #ifdef __cplusplus diff --git a/test/corpus/parameterized_expressions.txt b/test/corpus/parameterized_expressions.txt new file mode 100644 index 0000000..1b5d229 --- /dev/null +++ b/test/corpus/parameterized_expressions.txt @@ -0,0 +1,257 @@ +================== +Parameterized expression source values +================== + +foo({@foo | lower}, {.name | upper}, {$1 | add(5)}, {10 | multiply(2)}, {#true | some-function}, {"hello" | upper}, {#"2025-12-17" | some-function}) + +--- + +(source_file + (root_expression + (open_expression + (function_call + name: (function_name) + (argument_list + (positional_argument + (parameterized_expression + source: (variable) + expression: (open_expression + (function_call + name: (function_name))))) + (positional_argument + (parameterized_expression + source: (record_access + field: (record_field_selector + (named_record_field))) + expression: (open_expression + (function_call + name: (function_name))))) + (positional_argument + (parameterized_expression + source: (positional_element_access) + expression: (open_expression + (function_call + name: (function_name) + (argument_list + (positional_argument + (numeric_literal))))))) + (positional_argument + (parameterized_expression + source: (numeric_literal) + expression: (open_expression + (function_call + name: (function_name) + (argument_list + (positional_argument + (numeric_literal))))))) + (positional_argument + (parameterized_expression + source: (boolean_literal) + expression: (open_expression + (function_call + name: (function_name))))) + (positional_argument + (parameterized_expression + source: (double_quoted_literal + (double_quoted_content)) + expression: (open_expression + (function_call + name: (function_name))))) + (positional_argument + (parameterized_expression + source: (date_literal) + expression: (open_expression + (function_call + name: (function_name)))))))))) + +================== +Compound sources and multi-function pipeline +================== + +foo({{1,2,3} | sum | add(1)}, {T(1,2) | some-function}, {{name := "Alice"} | some-function}) + +--- + +(source_file + (root_expression + (open_expression + (function_call + name: (function_name) + (argument_list + (positional_argument + (parameterized_expression + source: (array_literal + (numeric_literal) + (numeric_literal) + (numeric_literal)) + expression: (open_expression + (function_call + name: (function_name)) + (function_call + name: (function_name) + (argument_list + (positional_argument + (numeric_literal))))))) + (positional_argument + (parameterized_expression + source: (tuple_literal + (numeric_literal) + (numeric_literal)) + expression: (open_expression + (function_call + name: (function_name))))) + (positional_argument + (parameterized_expression + source: (record_literal + (record_field + name: (record_field_name + (unquoted_record_field_name)) + value: (double_quoted_literal + (double_quoted_content)))) + expression: (open_expression + (function_call + name: (function_name)))))))))) + +================== +Parameterized expression whitespace +================== + +foo( { @foo|lower | trim } ) + +--- + +(source_file + (root_expression + (open_expression + (function_call + name: (function_name) + (argument_list + (positional_argument + (parameterized_expression + source: (variable) + expression: (open_expression + (function_call + name: (function_name)) + (function_call + name: (function_name)))))))))) + +================== +Arrays and records remain distinct +================== + +foo({1,2,3}, {name := "Alice"}, {@foo | lower}) + +--- + +(source_file + (root_expression + (open_expression + (function_call + name: (function_name) + (argument_list + (positional_argument + (array_literal + (numeric_literal) + (numeric_literal) + (numeric_literal))) + (positional_argument + (record_literal + (record_field + name: (record_field_name + (unquoted_record_field_name)) + value: (double_quoted_literal + (double_quoted_content))))) + (positional_argument + (parameterized_expression + source: (variable) + expression: (open_expression + (function_call + name: (function_name)))))))))) + +================== +Missing parameterized source +================== + +foo({| lower}) + +--- + +(source_file + (root_expression + (open_expression + (function_call + (function_name) + (argument_list + (positional_argument + (parameterized_expression + (MISSING numeric_literal) + (open_expression + (function_call + (function_name)))))))))) + +================== +Missing parameterized separator +================== + +foo({@foo lower}) + +--- + +(source_file + (root_expression + (open_expression + (function_call + (function_name) + (argument_list + (positional_argument + (array_literal + (variable) + (ERROR + (function_name))))))))) + +================== +Missing parameterized expression +================== + +foo({@foo | }) + +--- + +(source_file + (root_expression + (open_expression + (function_call + (function_name) + (argument_list + (positional_argument + (array_literal + (variable) + (ERROR)))))))) + +================== +Malformed nested parameterized expression +================== + +foo({@foo | bar({ | baz})}) + +--- + +(source_file + (root_expression + (open_expression + (function_call + name: (function_name) + (argument_list + (positional_argument + (parameterized_expression + source: (variable) + expression: (open_expression + (function_call + name: (function_name) + (argument_list + (positional_argument + (parameterized_expression + source: (MISSING numeric_literal) + expression: (open_expression + (function_call + name: (function_name))))))))))))))) From c585387a70ef5491a088325bf3ce1d811c439c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20L=2E=20Charlier?= Date: Thu, 13 Aug 2026 07:44:23 +0200 Subject: [PATCH 2/2] test: expand parameterized expression coverage --- .../SyntaxBindingTests.cs | 32 ++++++++++-- test/corpus/parameterized_expressions.txt | 52 +++++++++++++++++-- 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/bindings/csharp/Expressif.Syntax.Tests/SyntaxBindingTests.cs b/bindings/csharp/Expressif.Syntax.Tests/SyntaxBindingTests.cs index d7601e3..19ec17d 100644 --- a/bindings/csharp/Expressif.Syntax.Tests/SyntaxBindingTests.cs +++ b/bindings/csharp/Expressif.Syntax.Tests/SyntaxBindingTests.cs @@ -182,6 +182,23 @@ public void ParameterizedExpressionsPreserveSourceAndPipeline() }); } + [TestCase("{{1, 2} | sum}", typeof(ArrayLiteralSyntax), "{1, 2}")] + [TestCase("{T(1, 2) | some-function}", typeof(TupleLiteralSyntax), "T(1, 2)")] + [TestCase("{{name := \"Alice\"} | some-function}", typeof(RecordLiteralSyntax), "{name := \"Alice\"}")] + public void ParameterizedExpressionsPreserveCompoundSources(string argument, Type sourceType, string sourceText) + { + var root = (OpenExpressionSyntax)ExpressifSyntax.Parse($"foo({argument})"); + var parameterized = (ParameterizedExpressionSyntax)root.Pipeline.Single().Arguments.Single().Value; + + Assert.Multiple(() => + { + Assert.That(parameterized.Source, Is.TypeOf(sourceType)); + Assert.That(parameterized.Source.Text, Is.EqualTo(sourceText)); + Assert.That(parameterized.Text, Is.EqualTo(argument)); + Assert.That(parameterized.Expression.Pipeline, Has.Count.EqualTo(1)); + }); + } + [Test] public void BinderSupportsEveryGrammarValueNodeType() { @@ -210,12 +227,17 @@ public void SourceTextAndRangesAreLossless() }); } - [TestCase("add(")] - [TestCase("10 |")] - [TestCase("\"unterminated")] - public void MalformedInputExposesTreeSitterErrors(string source) + [TestCase("add(", false)] + [TestCase("10 |", false)] + [TestCase("\"unterminated", false)] + [TestCase("foo({| lower})", true)] + public void MalformedInputExposesTreeSitterErrors(string source, bool hasMissingError) { var exception = Assert.Throws(() => ExpressifSyntax.Parse(source)); - Assert.That(exception!.Errors, Is.Not.Empty); + Assert.Multiple(() => + { + Assert.That(exception!.Errors, Is.Not.Empty); + Assert.That(exception.Errors.Any(error => error.IsMissing), Is.EqualTo(hasMissingError)); + }); } } diff --git a/test/corpus/parameterized_expressions.txt b/test/corpus/parameterized_expressions.txt index 1b5d229..ae91f0c 100644 --- a/test/corpus/parameterized_expressions.txt +++ b/test/corpus/parameterized_expressions.txt @@ -169,7 +169,49 @@ foo({1,2,3}, {name := "Alice"}, {@foo | lower}) name: (function_name)))))))))) ================== -Missing parameterized source +Top-level braces do not form a parameterized expression +================== + +{@foo | lower} + +--- + +(source_file + (root_expression + (closed_expression + (array_literal + (variable) + (MISSING "}")) + (function_call + (function_name)))) + (ERROR)) + +================== +Nested braces recover as a positional parameterized expression, not an array element +================== + +foo({{@foo | lower}}) + +--- + +(source_file + (root_expression + (open_expression + (function_call + (function_name) + (argument_list + (positional_argument + (parameterized_expression + (array_literal + (variable) + (MISSING "}")) + (open_expression + (function_call + (function_name)))))) + (ERROR))))) + +================== +Missing source recovery snapshot rejects the parameterized expression ================== foo({| lower}) @@ -184,13 +226,14 @@ foo({| lower}) (argument_list (positional_argument (parameterized_expression + ; Tree-sitter currently synthesizes a numeric source here. (MISSING numeric_literal) (open_expression (function_call (function_name)))))))))) ================== -Missing parameterized separator +Missing separator recovery snapshot rejects an array literal ================== foo({@foo lower}) @@ -210,7 +253,7 @@ foo({@foo lower}) (function_name))))))))) ================== -Missing parameterized expression +Missing right-hand expression recovery snapshot rejects an array literal ================== foo({@foo | }) @@ -229,7 +272,7 @@ foo({@foo | }) (ERROR)))))))) ================== -Malformed nested parameterized expression +Malformed nested source recovery snapshot rejects the expression ================== foo({@foo | bar({ | baz})}) @@ -251,6 +294,7 @@ foo({@foo | bar({ | baz})}) (argument_list (positional_argument (parameterized_expression + ; Tree-sitter currently synthesizes a numeric source here. source: (MISSING numeric_literal) expression: (open_expression (function_call