diff --git a/tree-sitter-p4/grammar.js b/tree-sitter-p4/grammar.js index 1cd3aec..077d14b 100644 --- a/tree-sitter-p4/grammar.js +++ b/tree-sitter-p4/grammar.js @@ -88,17 +88,32 @@ export default grammar({ parserTransitionStatement: $ => seq($.transition, $.transitionSelectionExpression, $._semicolon), // Expressions - expression: $ => choice($.identifier, $.integer, $.booleanLiteralExpression, $.string_literal, $.binaryOperatorExpression, $.arrayAccessExpression, $.fieldAccessExpression), // Very limited. + expression: $ => choice($.grouped_expression, $.simple_expression), + grouped_expression: $ => seq('(', $.expression, ')'), + simple_expression: $ => choice($.identifier, $.integer, $.booleanLiteralExpression, $.string_literal, $.binaryOperatorExpression, $.arrayAccessExpression, $.fieldAccessExpression), // Very limited. booleanLiteralExpression: $ => choice($.true, $.false), selectExpression: $ => seq($.select, '(', $.expression, ')', '{', $.selectBody, '}'), // TODO: Should be expression list and not just a single expression transitionSelectionExpression: $ => choice($.identifier, $.selectExpression), keysetExpression: $ => $.expression, - binaryOperatorExpression: $ => choice($.binaryEqualOperatorExpression), - arrayAccessExpression: $=> seq($.expression, $.open_bracket, $.expression, $.close_bracket), + binaryOperatorExpression: $ => choice($.binaryEqualOperatorExpression, + $.binaryLessThanOperatorExpression, + $.binaryLessThanEqualOperatorExpression, + $.binaryGreaterThanOperatorExpression, + $.binaryGreaterThanEqualOperatorExpression, + $.binaryAndOperatorExpression, + $.binaryOrOperatorExpression, + ), + arrayAccessExpression: $ => seq($.expression, $.open_bracket, $.expression, $.close_bracket), fieldAccessExpression: $=> prec.left(2, seq($.expression, $.field_access, $.identifier)), // Binary Operations binaryEqualOperatorExpression: $ => prec.left(2, seq($.expression, $.double_equal, $.expression)), + binaryLessThanOperatorExpression: $ => prec.left(2, seq($.expression, $.less_than, $.expression)), + binaryLessThanEqualOperatorExpression: $ => prec.left(2, seq($.expression, $.less_than_equal, $.expression)), + binaryGreaterThanOperatorExpression: $ => prec.left(2, seq($.expression, $.greater_than, $.expression)), + binaryGreaterThanEqualOperatorExpression: $ => prec.left(2, seq($.expression, $.greater_than_equal, $.expression)), + binaryAndOperatorExpression: $ => prec.left(2, seq($.expression, $.and, $.expression)), + binaryOrOperatorExpression: $ => prec.left(2, seq($.expression, $.or, $.expression)), // Tokens _semicolon: $ => ";", @@ -150,10 +165,19 @@ export default grammar({ void: $ => "void", identifier: $ => /[A-Za-z_]+/, type_identifier: $ => /[A-Za-z_]+/, - string_literal: $ => /".*"/, + string_literal: $ => /"[^"]*"/, integer: $ => /[0-9]+/, annotation_literal: $ => /@[A-Za-z_]+/, + double_equal: $=> '==', + less_than: $=> '<', + less_than_equal: $=> '<=', + greater_than: $=> '>', + greater_than_equal: $=> '>=', + + and: $=> "&&", + or: $=> "||", + open_bracket: $=> '[', close_bracket: $=> ']', field_access: $=> '.', diff --git a/tree-sitter-p4/test/corpus/declarations.txt b/tree-sitter-p4/test/corpus/declarations.txt index e04de27..0499221 100644 --- a/tree-sitter-p4/test/corpus/declarations.txt +++ b/tree-sitter-p4/test/corpus/declarations.txt @@ -169,7 +169,9 @@ parser simple() { (identifier) (assignment) (expression - (string_literal) + (simple_expression + (string_literal) + ) ) ) ) diff --git a/tree-sitter-p4/test/corpus/expressions.txt b/tree-sitter-p4/test/corpus/expressions.txt index fb3cf34..735fd71 100644 --- a/tree-sitter-p4/test/corpus/expressions.txt +++ b/tree-sitter-p4/test/corpus/expressions.txt @@ -26,17 +26,23 @@ parser simple() { (conditionalStatement (if) (expression - (binaryOperatorExpression - (binaryEqualOperatorExpression - (expression - (booleanLiteralExpression - (true) + (simple_expression + (binaryOperatorExpression + (binaryEqualOperatorExpression + (expression + (simple_expression + (booleanLiteralExpression + (true) + ) + ) ) - ) - (double_equal) - (expression - (booleanLiteralExpression - (false) + (double_equal) + (expression + (simple_expression + (booleanLiteralExpression + (false) + ) + ) ) ) ) @@ -88,14 +94,20 @@ parser simple() { (conditionalStatement (if) (expression - (binaryOperatorExpression - (binaryEqualOperatorExpression - (expression - (integer) - ) - (double_equal) - (expression - (integer) + (simple_expression + (binaryOperatorExpression + (binaryEqualOperatorExpression + (expression + (simple_expression + (integer) + ) + ) + (double_equal) + (expression + (simple_expression + (integer) + ) + ) ) ) ) @@ -144,15 +156,21 @@ parser simple() { (parserStatement (expressionStatement (expression - (arrayAccessExpression - (expression - (identifier) + (simple_expression + (arrayAccessExpression + (expression + (simple_expression + (identifier) + ) + ) + (open_bracket) + (expression + (simple_expression + (integer) + ) + ) + (close_bracket) ) - (open_bracket) - (expression - (integer) - ) - (close_bracket) ) ) ) @@ -196,12 +214,16 @@ parser simple() { (parserStatement (expressionStatement (expression - (fieldAccessExpression - (expression + (simple_expression + (fieldAccessExpression + (expression + (simple_expression + (identifier) + ) + ) + (field_access) (identifier) ) - (field_access) - (identifier) ) ) ) @@ -245,18 +267,24 @@ parser simple() { (parserStatement (expressionStatement (expression - (fieldAccessExpression - (expression - (fieldAccessExpression - (expression - (identifier) + (simple_expression + (fieldAccessExpression + (expression + (simple_expression + (fieldAccessExpression + (expression + (simple_expression + (identifier) + ) + ) + (field_access) + (identifier) + ) ) - (field_access) - (identifier) ) + (field_access) + (identifier) ) - (field_access) - (identifier) ) ) ) diff --git a/tree-sitter-p4/test/corpus/statements.txt b/tree-sitter-p4/test/corpus/statements.txt index 58c9707..52c6c75 100644 --- a/tree-sitter-p4/test/corpus/statements.txt +++ b/tree-sitter-p4/test/corpus/statements.txt @@ -26,8 +26,10 @@ parser simple() { (conditionalStatement (if) (expression - (booleanLiteralExpression - (true) + (simple_expression + (booleanLiteralExpression + (true) + ) ) ) (statement @@ -77,8 +79,10 @@ parser simple() { (conditionalStatement (if) (expression - (booleanLiteralExpression - (true) + (simple_expression + (booleanLiteralExpression + (true) + ) ) ) (statement @@ -137,18 +141,24 @@ parser simple() { (identifier) (assignment) (expression - (string_literal) + (simple_expression + (string_literal) + ) ) ) ) (parserStatement (assignmentStatement (expression - (identifier) + (simple_expression + (identifier) + ) ) (assignment) (expression - (string_literal) + (simple_expression + (string_literal) + ) ) ) ) @@ -201,8 +211,10 @@ parser simple() { (identifier) (assignment) (expression - (booleanLiteralExpression - (true) + (simple_expression + (booleanLiteralExpression + (true) + ) ) ) ) @@ -211,7 +223,9 @@ parser simple() { (conditionalStatement (if) (expression - (identifier) + (simple_expression + (identifier) + ) ) (statement (blockStatement @@ -219,12 +233,16 @@ parser simple() { (statement (assignmentStatement (expression - (identifier) + (simple_expression + (identifier) + ) ) (assignment) (expression - (booleanLiteralExpression - (false) + (simple_expression + (booleanLiteralExpression + (false) + ) ) ) ) @@ -286,8 +304,10 @@ parser simple() { (identifier) (assignment) (expression - (booleanLiteralExpression - (true) + (simple_expression + (booleanLiteralExpression + (true) + ) ) ) ) @@ -302,7 +322,9 @@ parser simple() { (identifier) (assignment) (expression - (integer) + (simple_expression + (integer) + ) ) ) ) @@ -310,7 +332,9 @@ parser simple() { (conditionalStatement (if) (expression - (identifier) + (simple_expression + (identifier) + ) ) (statement (blockStatement @@ -318,11 +342,15 @@ parser simple() { (statement (assignmentStatement (expression - (identifier) + (simple_expression + (identifier) + ) ) (assignment) (expression - (integer) + (simple_expression + (integer) + ) ) ) ) @@ -336,11 +364,15 @@ parser simple() { (statement (assignmentStatement (expression - (identifier) + (simple_expression + (identifier) + ) ) (assignment) (expression - (integer) + (simple_expression + (integer) + ) ) ) ) diff --git a/tree-sitter-p4/test/corpus/transitions.txt b/tree-sitter-p4/test/corpus/transitions.txt index 045c0ad..47042d2 100644 --- a/tree-sitter-p4/test/corpus/transitions.txt +++ b/tree-sitter-p4/test/corpus/transitions.txt @@ -60,14 +60,18 @@ parser simple() { (selectExpression (select) (expression - (identifier) + (simple_expression + (identifier) + ) ) (selectBody (selectCase (keysetExpression (expression - (booleanLiteralExpression - (true) + (simple_expression + (booleanLiteralExpression + (true) + ) ) ) )