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:
@@ -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,
|
||||||
|
$.binaryLessThanOperatorExpression,
|
||||||
|
$.binaryLessThanEqualOperatorExpression,
|
||||||
|
$.binaryGreaterThanOperatorExpression,
|
||||||
|
$.binaryGreaterThanEqualOperatorExpression,
|
||||||
|
$.binaryAndOperatorExpression,
|
||||||
|
$.binaryOrOperatorExpression,
|
||||||
|
),
|
||||||
arrayAccessExpression: $ => seq($.expression, $.open_bracket, $.expression, $.close_bracket),
|
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
|
||||||
|
|||||||
@@ -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)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user