Binary Operators (and Grouping in Expressions)

Add support for <, <=, >, >=, && and ||.

Also, add support for grouping (with ( and )) in expressions.

Signed-off-by: Will Hawkins <hawkinsw@obs.cr>
This commit is contained in:
Will Hawkins
2026-03-23 07:53:41 -04:00
parent 6ff7c5175d
commit 7c35b2b6e5
5 changed files with 158 additions and 68 deletions
+28 -4
View File
@@ -88,17 +88,32 @@ export default grammar({
parserTransitionStatement: $ => seq($.transition, $.transitionSelectionExpression, $._semicolon), parserTransitionStatement: $ => seq($.transition, $.transitionSelectionExpression, $._semicolon),
// Expressions // 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), booleanLiteralExpression: $ => choice($.true, $.false),
selectExpression: $ => seq($.select, '(', $.expression, ')', '{', $.selectBody, '}'), // TODO: Should be expression list and not just a single expression selectExpression: $ => seq($.select, '(', $.expression, ')', '{', $.selectBody, '}'), // TODO: Should be expression list and not just a single expression
transitionSelectionExpression: $ => choice($.identifier, $.selectExpression), transitionSelectionExpression: $ => choice($.identifier, $.selectExpression),
keysetExpression: $ => $.expression, keysetExpression: $ => $.expression,
binaryOperatorExpression: $ => choice($.binaryEqualOperatorExpression), binaryOperatorExpression: $ => choice($.binaryEqualOperatorExpression,
arrayAccessExpression: $=> seq($.expression, $.open_bracket, $.expression, $.close_bracket), $.binaryLessThanOperatorExpression,
$.binaryLessThanEqualOperatorExpression,
$.binaryGreaterThanOperatorExpression,
$.binaryGreaterThanEqualOperatorExpression,
$.binaryAndOperatorExpression,
$.binaryOrOperatorExpression,
),
arrayAccessExpression: $ => seq($.expression, $.open_bracket, $.expression, $.close_bracket),
fieldAccessExpression: $=> prec.left(2, seq($.expression, $.field_access, $.identifier)), fieldAccessExpression: $=> prec.left(2, seq($.expression, $.field_access, $.identifier)),
// Binary Operations // Binary Operations
binaryEqualOperatorExpression: $ => prec.left(2, seq($.expression, $.double_equal, $.expression)), 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 // Tokens
_semicolon: $ => ";", _semicolon: $ => ";",
@@ -150,10 +165,19 @@ export default grammar({
void: $ => "void", void: $ => "void",
identifier: $ => /[A-Za-z_]+/, identifier: $ => /[A-Za-z_]+/,
type_identifier: $ => /[A-Za-z_]+/, type_identifier: $ => /[A-Za-z_]+/,
string_literal: $ => /".*"/, string_literal: $ => /"[^"]*"/,
integer: $ => /[0-9]+/, integer: $ => /[0-9]+/,
annotation_literal: $ => /@[A-Za-z_]+/, annotation_literal: $ => /@[A-Za-z_]+/,
double_equal: $=> '==', double_equal: $=> '==',
less_than: $=> '<',
less_than_equal: $=> '<=',
greater_than: $=> '>',
greater_than_equal: $=> '>=',
and: $=> "&&",
or: $=> "||",
open_bracket: $=> '[', open_bracket: $=> '[',
close_bracket: $=> ']', close_bracket: $=> ']',
field_access: $=> '.', field_access: $=> '.',
@@ -169,11 +169,13 @@ parser simple() {
(identifier) (identifier)
(assignment) (assignment)
(expression (expression
(simple_expression
(string_literal) (string_literal)
) )
) )
) )
) )
)
(parserTransitionStatement (parserTransitionStatement
(transition) (transition)
(transitionSelectionExpression (transitionSelectionExpression
@@ -26,15 +26,19 @@ parser simple() {
(conditionalStatement (conditionalStatement
(if) (if)
(expression (expression
(simple_expression
(binaryOperatorExpression (binaryOperatorExpression
(binaryEqualOperatorExpression (binaryEqualOperatorExpression
(expression (expression
(simple_expression
(booleanLiteralExpression (booleanLiteralExpression
(true) (true)
) )
) )
)
(double_equal) (double_equal)
(expression (expression
(simple_expression
(booleanLiteralExpression (booleanLiteralExpression
(false) (false)
) )
@@ -42,6 +46,8 @@ parser simple() {
) )
) )
) )
)
)
(statement (statement
(blockStatement) (blockStatement)
) )
@@ -88,18 +94,24 @@ parser simple() {
(conditionalStatement (conditionalStatement
(if) (if)
(expression (expression
(simple_expression
(binaryOperatorExpression (binaryOperatorExpression
(binaryEqualOperatorExpression (binaryEqualOperatorExpression
(expression (expression
(simple_expression
(integer) (integer)
) )
)
(double_equal) (double_equal)
(expression (expression
(simple_expression
(integer) (integer)
) )
) )
) )
) )
)
)
(statement (statement
(blockStatement) (blockStatement)
) )
@@ -144,20 +156,26 @@ parser simple() {
(parserStatement (parserStatement
(expressionStatement (expressionStatement
(expression (expression
(simple_expression
(arrayAccessExpression (arrayAccessExpression
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(open_bracket) (open_bracket)
(expression (expression
(simple_expression
(integer) (integer)
) )
)
(close_bracket) (close_bracket)
) )
) )
) )
) )
) )
)
(parserTransitionStatement (parserTransitionStatement
(transition) (transition)
(transitionSelectionExpression (transitionSelectionExpression
@@ -196,10 +214,13 @@ parser simple() {
(parserStatement (parserStatement
(expressionStatement (expressionStatement
(expression (expression
(simple_expression
(fieldAccessExpression (fieldAccessExpression
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(field_access) (field_access)
(identifier) (identifier)
) )
@@ -207,6 +228,7 @@ parser simple() {
) )
) )
) )
)
(parserTransitionStatement (parserTransitionStatement
(transition) (transition)
(transitionSelectionExpression (transitionSelectionExpression
@@ -245,16 +267,21 @@ parser simple() {
(parserStatement (parserStatement
(expressionStatement (expressionStatement
(expression (expression
(simple_expression
(fieldAccessExpression (fieldAccessExpression
(expression (expression
(simple_expression
(fieldAccessExpression (fieldAccessExpression
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(field_access) (field_access)
(identifier) (identifier)
) )
) )
)
(field_access) (field_access)
(identifier) (identifier)
) )
@@ -262,6 +289,7 @@ parser simple() {
) )
) )
) )
)
(parserTransitionStatement (parserTransitionStatement
(transition) (transition)
(transitionSelectionExpression (transitionSelectionExpression
+32
View File
@@ -26,10 +26,12 @@ parser simple() {
(conditionalStatement (conditionalStatement
(if) (if)
(expression (expression
(simple_expression
(booleanLiteralExpression (booleanLiteralExpression
(true) (true)
) )
) )
)
(statement (statement
(blockStatement) (blockStatement)
) )
@@ -77,10 +79,12 @@ parser simple() {
(conditionalStatement (conditionalStatement
(if) (if)
(expression (expression
(simple_expression
(booleanLiteralExpression (booleanLiteralExpression
(true) (true)
) )
) )
)
(statement (statement
(blockStatement) (blockStatement)
) )
@@ -137,22 +141,28 @@ parser simple() {
(identifier) (identifier)
(assignment) (assignment)
(expression (expression
(simple_expression
(string_literal) (string_literal)
) )
) )
) )
)
(parserStatement (parserStatement
(assignmentStatement (assignmentStatement
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(assignment) (assignment)
(expression (expression
(simple_expression
(string_literal) (string_literal)
) )
) )
) )
) )
)
(parserTransitionStatement (parserTransitionStatement
(transition) (transition)
(transitionSelectionExpression (transitionSelectionExpression
@@ -201,28 +211,35 @@ parser simple() {
(identifier) (identifier)
(assignment) (assignment)
(expression (expression
(simple_expression
(booleanLiteralExpression (booleanLiteralExpression
(true) (true)
) )
) )
) )
) )
)
(parserStatement (parserStatement
(conditionalStatement (conditionalStatement
(if) (if)
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(statement (statement
(blockStatement (blockStatement
(statements (statements
(statement (statement
(assignmentStatement (assignmentStatement
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(assignment) (assignment)
(expression (expression
(simple_expression
(booleanLiteralExpression (booleanLiteralExpression
(false) (false)
) )
@@ -235,6 +252,7 @@ parser simple() {
) )
) )
) )
)
(parserTransitionStatement (parserTransitionStatement
(transition) (transition)
(transitionSelectionExpression (transitionSelectionExpression
@@ -286,12 +304,14 @@ parser simple() {
(identifier) (identifier)
(assignment) (assignment)
(expression (expression
(simple_expression
(booleanLiteralExpression (booleanLiteralExpression
(true) (true)
) )
) )
) )
) )
)
(parserStatement (parserStatement
(variableDeclaration (variableDeclaration
(typeRef (typeRef
@@ -302,26 +322,33 @@ parser simple() {
(identifier) (identifier)
(assignment) (assignment)
(expression (expression
(simple_expression
(integer) (integer)
) )
) )
) )
)
(parserStatement (parserStatement
(conditionalStatement (conditionalStatement
(if) (if)
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(statement (statement
(blockStatement (blockStatement
(statements (statements
(statement (statement
(assignmentStatement (assignmentStatement
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(assignment) (assignment)
(expression (expression
(simple_expression
(integer) (integer)
) )
) )
@@ -329,6 +356,7 @@ parser simple() {
) )
) )
) )
)
(else) (else)
(statement (statement
(blockStatement (blockStatement
@@ -336,10 +364,13 @@ parser simple() {
(statement (statement
(assignmentStatement (assignmentStatement
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(assignment) (assignment)
(expression (expression
(simple_expression
(integer) (integer)
) )
) )
@@ -350,6 +381,7 @@ parser simple() {
) )
) )
) )
)
(parserTransitionStatement (parserTransitionStatement
(transition) (transition)
(transitionSelectionExpression (transitionSelectionExpression
@@ -60,17 +60,21 @@ parser simple() {
(selectExpression (selectExpression
(select) (select)
(expression (expression
(simple_expression
(identifier) (identifier)
) )
)
(selectBody (selectBody
(selectCase (selectCase
(keysetExpression (keysetExpression
(expression (expression
(simple_expression
(booleanLiteralExpression (booleanLiteralExpression
(true) (true)
) )
) )
) )
)
(colon) (colon)
(identifier) (identifier)
) )