From 7cdbee19995448071142b2108274b487680cb088 Mon Sep 17 00:00:00 2001 From: Will Hawkins Date: Thu, 2 Apr 2026 01:28:27 -0400 Subject: [PATCH] Refactor Parser For Parameter Lists Signed-off-by: Will Hawkins --- tree-sitter-p4/grammar.js | 5 +++-- tree-sitter-p4/test/corpus/annotations.txt | 2 ++ tree-sitter-p4/test/corpus/declarations.txt | 5 +++++ tree-sitter-p4/test/corpus/expressions.txt | 5 +++++ tree-sitter-p4/test/corpus/parsers.txt | 15 +++++++++------ tree-sitter-p4/test/corpus/statements.txt | 5 +++++ tree-sitter-p4/test/corpus/transitions.txt | 3 +++ 7 files changed, 32 insertions(+), 8 deletions(-) diff --git a/tree-sitter-p4/grammar.js b/tree-sitter-p4/grammar.js index e64e00b..b656965 100644 --- a/tree-sitter-p4/grammar.js +++ b/tree-sitter-p4/grammar.js @@ -32,6 +32,7 @@ export default grammar({ parameter_list: $ => choice($.parameter, seq($.parameter_list, ',', $.parameter)), parameter: $ => choice(seq(optional($.annotations), optional($.direction), $.typeRef, $.identifier), seq(optional($.annotations), optional($.direction), $.typeRef, $.identifier, '=', $.expression)), direction: $ => choice($.in, $.out, $.inout), + parameters: $=> seq('(', optional($.parameter_list), ')'), // Common - Types typeRef: $ => choice($.baseType, $.type_identifier), @@ -39,7 +40,7 @@ export default grammar({ constructor_parameters: $ => seq('(', optional($.parameter_list), ')'), // Common - Parsers - parserType: $ => seq(optional($.annotations), $.parser, field('parser_name', $.identifier), optional($.typeParameters), '(', optional($.parameter_list), ')'), + parserType: $ => seq(optional($.annotations), $.parser, field('parser_name', $.identifier), optional($.typeParameters), $.parameters), // Mark with higher precedence so that the local states are preferred when parsing! // TODO: Test! @@ -70,7 +71,7 @@ export default grammar({ struct_declaration_fields: $=> repeat1(seq($.variableDeclaration)), // Make separate productions for the parser type and the parser type declaration because the latter can have type parameters. - parserTypeDeclaration: $ => seq(optional($.annotations), $.parser, field('parser_name', $.identifier), optional($.typeParameters), '(', optional($.parameter_list), ')'), + parserTypeDeclaration: $ => seq(optional($.annotations), $.parser, field('parser_name', $.identifier), optional($.typeParameters), $.parameters), parserDeclaration: $ => seq($.parserType, '{', optional($.parserLocalElements), $.parserStates, '}'), variableDeclaration: $ => seq(optional($.annotations), $.typeRef, field('variable_name', $.identifier), optional(seq($.assignment, $.expression)), $._semicolon), diff --git a/tree-sitter-p4/test/corpus/annotations.txt b/tree-sitter-p4/test/corpus/annotations.txt index 900e76d..5e62c8b 100644 --- a/tree-sitter-p4/test/corpus/annotations.txt +++ b/tree-sitter-p4/test/corpus/annotations.txt @@ -20,6 +20,7 @@ Simple Annotated Declaration ) (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -66,6 +67,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState diff --git a/tree-sitter-p4/test/corpus/declarations.txt b/tree-sitter-p4/test/corpus/declarations.txt index de1321e..0a7983c 100644 --- a/tree-sitter-p4/test/corpus/declarations.txt +++ b/tree-sitter-p4/test/corpus/declarations.txt @@ -15,6 +15,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -61,6 +62,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -107,6 +109,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -153,6 +156,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -205,6 +209,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState diff --git a/tree-sitter-p4/test/corpus/expressions.txt b/tree-sitter-p4/test/corpus/expressions.txt index 735fd71..048c1fb 100644 --- a/tree-sitter-p4/test/corpus/expressions.txt +++ b/tree-sitter-p4/test/corpus/expressions.txt @@ -16,6 +16,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -84,6 +85,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -147,6 +149,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -205,6 +208,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -258,6 +262,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState diff --git a/tree-sitter-p4/test/corpus/parsers.txt b/tree-sitter-p4/test/corpus/parsers.txt index 5a75eca..43f95ce 100644 --- a/tree-sitter-p4/test/corpus/parsers.txt +++ b/tree-sitter-p4/test/corpus/parsers.txt @@ -14,6 +14,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -48,14 +49,16 @@ parser imple(bool pname) { (parserType (parser) (identifier) - (parameter_list - (parameter - (typeRef - (baseType - (bool) + (parameters + (parameter_list + (parameter + (typeRef + (baseType + (bool) + ) ) + (identifier) ) - (identifier) ) ) ) diff --git a/tree-sitter-p4/test/corpus/statements.txt b/tree-sitter-p4/test/corpus/statements.txt index 52c6c75..89228fb 100644 --- a/tree-sitter-p4/test/corpus/statements.txt +++ b/tree-sitter-p4/test/corpus/statements.txt @@ -16,6 +16,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -69,6 +70,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -125,6 +127,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -195,6 +198,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -288,6 +292,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState diff --git a/tree-sitter-p4/test/corpus/transitions.txt b/tree-sitter-p4/test/corpus/transitions.txt index d755667..755e2f4 100644 --- a/tree-sitter-p4/test/corpus/transitions.txt +++ b/tree-sitter-p4/test/corpus/transitions.txt @@ -14,6 +14,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -49,6 +50,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState @@ -106,6 +108,7 @@ parser simple() { (parserType (parser) (identifier) + (parameters) ) (parserStates (parserState