diff --git a/Sources/P4Parser/Expression.swift b/Sources/P4Parser/Expression.swift index d5f3ae2..f22d1dc 100644 --- a/Sources/P4Parser/Expression.swift +++ b/Sources/P4Parser/Expression.swift @@ -168,14 +168,16 @@ struct Expression { ] for le_parser in localElementsParsers { - if case Result.Ok(.some(let parsed)) = le_parser.parse( + switch le_parser.parse( node: node, inTree: inTree, withScopes: scopes) { - return .Ok(parsed) + case .Ok(.some(let parsed)): return .Ok(parsed) + case .Error(let e): return .Error(e) + default: continue } } - return Result.Error(Error(withMessage: "Could not parse into expression.")) + return Result.Error(Error(withMessage: "\(node.range): Could not parse into expression")) } } diff --git a/Sources/P4Parser/Parser.swift b/Sources/P4Parser/Parser.swift index ce727dd..111fd08 100644 --- a/Sources/P4Parser/Parser.swift +++ b/Sources/P4Parser/Parser.swift @@ -212,26 +212,27 @@ public struct Parser { } let body_node = body[0].node var kses: [KeysetExpression] = Array() - for childidx in 0.. Void) { + for childIdx in 0.. optional(repeat(seq(choice($.declaration, $.instantiation), $.semicolon))), + p4program: $ => optional(repeat(seq(choice($.declaration, $.instantiation), $._semicolon))), // Common @@ -43,14 +43,14 @@ export default grammar({ // Mark with higher precedence so that the local states are preferred when parsing! // TODO: Test! - parserLocalElements: $ => prec(2, repeat1(seq($.parserLocalElement, $.semicolon))), + parserLocalElements: $ => prec(2, repeat1($.parserLocalElement)), parserStates: $ => repeat1($.parserState), - parserState: $ => seq(optional($.annotations), $.state, $.identifier, '{', optional($.parserLocalElements), optional($.parserStatements), $.parserTransitionStatement, $.semicolon, '}'), + parserState: $ => seq(optional($.annotations), $.state, $.identifier, '{', optional($.parserLocalElements), optional($.parserStatements), $.parserTransitionStatement, '}'), parserLocalElement: $ => choice($.variableDeclaration, $.todo), - selectBody: $ => repeat1(seq($.selectCase, $.semicolon)), + selectBody: $ => repeat1(seq($.selectCase, $._semicolon)), selectCase: $ => seq($.keysetExpression, $.colon, $.identifier), annotations: $ => repeat1($.annotation), @@ -69,23 +69,23 @@ export default grammar({ parserTypeDeclaration: $ => seq(optional($.annotations), $.parser, field('parser_name', $.identifier), optional($.typeParameters), '(', optional($.parameterList), ')'), parserDeclaration: $ => seq($.parserType, optional($.constructorParameters), '{', optional($.parserLocalElements), $.parserStates, '}'), - variableDeclaration: $ => seq(optional($.annotations), $.typeRef, field('variable_name', $.identifier), optional(seq($.assignment, $.expression))), + variableDeclaration: $ => seq(optional($.annotations), $.typeRef, field('variable_name', $.identifier), optional(seq($.assignment, $.expression)), $._semicolon), // Statements // General statements - statements: $ => repeat1(seq($.statement, $.semicolon)), + statements: $ => repeat1($.statement), statement: $ => choice($.conditionalStatement, $.blockStatement, $.expressionStatement, $.assignmentStatement),// Limited, so far. blockStatement: $ => seq(optional($.annotations), '{', optional($.statements), '}'), conditionalStatement: $ => choice(prec(1, seq($.if, '(', $.expression, ')', $.statement)), prec(2, seq($.if, '(', $.expression, ')', $.statement, $.else, $.statement))), - expressionStatement: $=> $.expression, - assignmentStatement: $=> seq($.expression, $.assignment, $.expression), + expressionStatement: $=> seq($.expression, $._semicolon), + assignmentStatement: $=> seq($.expression, $.assignment, $.expression, $._semicolon), // Parser statements - parserStatements: $ => repeat1(seq($.parserStatement, $.semicolon)), + parserStatements: $ => repeat1($.parserStatement), parserStatement: $ => choice($.conditionalStatement, $.parserBlockStatement, $.expressionStatement, $.assignmentStatement), // Limited, so far. parserBlockStatement: $ => seq(optional($.annotations), '{', $.parserStatements, '}'), - parserTransitionStatement: $ => seq($.transition, $.transitionSelectionExpression), + parserTransitionStatement: $ => seq($.transition, $.transitionSelectionExpression, $._semicolon), // Expressions expression: $ => choice($.identifier, $.integer, $.true, $.false, $.string_literal), // Very limited. @@ -94,7 +94,7 @@ export default grammar({ keysetExpression: $ => $.expression, // Tokens - semicolon: $ => ";", + _semicolon: $ => ";", colon: $ => ":", assignment: $ => "=", todo: $ => "todo", diff --git a/tree-sitter-p4/test.txt b/tree-sitter-p4/test.txt index 5e86163..4236484 100644 --- a/tree-sitter-p4/test.txt +++ b/tree-sitter-p4/test.txt @@ -1,16 +1,7 @@ parser main_parser() { - state next_state { - transition reject; - } - state not_next_state { - transition reject; - } state start { - transition starts; - } - state starts { - transition select (se) { - true: next_state; - }; + bool where_to = true; + string where_from = where_to; + transition reject; } }; diff --git a/tree-sitter-p4/test/corpus/declarations.txt b/tree-sitter-p4/test/corpus/declarations.txt index 8dd5482..1749c51 100644 --- a/tree-sitter-p4/test/corpus/declarations.txt +++ b/tree-sitter-p4/test/corpus/declarations.txt @@ -31,7 +31,6 @@ parser simple() { (identifier) ) ) - (semicolon) ) (parserTransitionStatement (transition) @@ -39,12 +38,10 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) ========================= @@ -80,7 +77,6 @@ parser simple() { (identifier) ) ) - (semicolon) ) (parserTransitionStatement (transition) @@ -88,12 +84,10 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) ========================= @@ -129,7 +123,6 @@ parser simple() { (identifier) ) ) - (semicolon) ) (parserTransitionStatement (transition) @@ -137,12 +130,10 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) ========================= @@ -182,7 +173,6 @@ parser simple() { ) ) ) - (semicolon) ) (parserTransitionStatement (transition) @@ -190,11 +180,9 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) diff --git a/tree-sitter-p4/test/corpus/instantiations.txt b/tree-sitter-p4/test/corpus/instantiations.txt index 6ab3c67..219a025 100644 --- a/tree-sitter-p4/test/corpus/instantiations.txt +++ b/tree-sitter-p4/test/corpus/instantiations.txt @@ -12,6 +12,5 @@ bool() main; ) (identifier) ) - (semicolon) ) diff --git a/tree-sitter-p4/test/corpus/parsers.txt b/tree-sitter-p4/test/corpus/parsers.txt index c9d6344..70cad21 100644 --- a/tree-sitter-p4/test/corpus/parsers.txt +++ b/tree-sitter-p4/test/corpus/parsers.txt @@ -25,12 +25,10 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) @@ -71,10 +69,8 @@ parser imple(bool pname) { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) diff --git a/tree-sitter-p4/test/corpus/statements.txt b/tree-sitter-p4/test/corpus/statements.txt index 7a07923..ec5a460 100644 --- a/tree-sitter-p4/test/corpus/statements.txt +++ b/tree-sitter-p4/test/corpus/statements.txt @@ -4,7 +4,7 @@ Simple If Statement (No Else) parser simple() { state start { if (true) { - }; + } transition accept; } }; @@ -33,7 +33,6 @@ parser simple() { ) ) ) - (semicolon) ) (parserTransitionStatement (transition) @@ -41,12 +40,10 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) ========================= @@ -56,7 +53,7 @@ parser simple() { state start { if (true) { } else { - }; + } transition accept; } }; @@ -89,7 +86,6 @@ parser simple() { ) ) ) - (semicolon) ) (parserTransitionStatement (transition) @@ -97,12 +93,10 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) ========================= @@ -143,7 +137,6 @@ parser simple() { ) ) ) - (semicolon) ) (parserStatements (parserStatement @@ -157,7 +150,6 @@ parser simple() { ) ) ) - (semicolon) ) (parserTransitionStatement (transition) @@ -165,12 +157,10 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) ========================= @@ -181,7 +171,7 @@ parser simple() { bool x = true; if (x) { x = false; - }; + } transition accept; } }; @@ -213,7 +203,6 @@ parser simple() { ) ) ) - (semicolon) ) (parserStatements (parserStatement @@ -236,13 +225,11 @@ parser simple() { ) ) ) - (semicolon) ) ) ) ) ) - (semicolon) ) (parserTransitionStatement (transition) @@ -250,12 +237,10 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) ========================= @@ -269,7 +254,7 @@ parser simple() { y = 1; } else { y = 2; - }; + } transition accept; } }; @@ -301,7 +286,6 @@ parser simple() { ) ) ) - (semicolon) (parserLocalElement (variableDeclaration (typeRef @@ -316,7 +300,6 @@ parser simple() { ) ) ) - (semicolon) ) (parserStatements (parserStatement @@ -339,7 +322,6 @@ parser simple() { ) ) ) - (semicolon) ) ) ) @@ -358,13 +340,11 @@ parser simple() { ) ) ) - (semicolon) ) ) ) ) ) - (semicolon) ) (parserTransitionStatement (transition) @@ -372,11 +352,9 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) diff --git a/tree-sitter-p4/test/corpus/transitions.txt b/tree-sitter-p4/test/corpus/transitions.txt index 1cda980..bdc1989 100644 --- a/tree-sitter-p4/test/corpus/transitions.txt +++ b/tree-sitter-p4/test/corpus/transitions.txt @@ -25,12 +25,10 @@ parser simple() { (identifier) ) ) - (semicolon) ) ) ) ) - (semicolon) ) ========================= @@ -74,15 +72,12 @@ parser simple() { (colon) (identifier) ) - (semicolon) ) ) ) ) - (semicolon) ) ) ) ) - (semicolon) )