Add logical and comparison expressions

This commit is contained in:
2026-06-17 23:38:44 +09:00
parent 3f7dd7c692
commit 2fe54bda62
18 changed files with 6627 additions and 4620 deletions
@@ -102,3 +102,30 @@ Arithmetic
right: (literal (integer))))
right: (unary_expression
operand: (literal (integer)))))))
==================
Logical and comparison
==================
{
enabled = env == "prod" && replicas > 1;
disabled = !enabled || false;
}
---
(source_file
(object
(field_definition
path: (field_path (identifier))
value: (binary_expression
left: (binary_expression
left: (identifier)
right: (literal (string)))
right: (binary_expression
left: (identifier)
right: (literal (integer)))))
(field_definition
path: (field_path (identifier))
value: (binary_expression
left: (unary_expression
operand: (identifier))
right: (literal (boolean))))))
+27 -9
View File
@@ -1,12 +1,15 @@
const PREC = {
DEFAULT: 1,
PATCH: 2,
AND: 3,
ADD: 4,
MUL: 5,
UNARY: 6,
CALL: 7,
PATH: 8,
COMPOSE: 3,
OR: 4,
LOGICAL_AND: 5,
COMPARE: 6,
ADD: 7,
MUL: 8,
UNARY: 9,
CALL: 10,
PATH: 11,
};
function commaSep(rule) {
@@ -163,17 +166,32 @@ module.exports = grammar({
field('field', $.identifier),
)),
comparison_constraint: $ => prec(6, seq(
comparison_constraint: $ => prec.right(PREC.UNARY + 1, seq(
field('operator', choice('>', '>=', '<', '<=')),
field('value', $._expression),
)),
unary_expression: $ => prec(PREC.UNARY, seq(
field('operator', '-'),
field('operator', choice('-', '!')),
field('operand', $._expression),
)),
binary_expression: $ => choice(
prec.left(PREC.OR, seq(
field('left', $._expression),
field('operator', token(prec(2, '||'))),
field('right', $._expression),
)),
prec.left(PREC.LOGICAL_AND, seq(
field('left', $._expression),
field('operator', token(prec(2, '&&'))),
field('right', $._expression),
)),
prec.left(PREC.COMPARE, seq(
field('left', $._expression),
field('operator', choice('==', '!=', '>', '>=', '<', '<=')),
field('right', $._expression),
)),
prec.left(PREC.ADD, seq(
field('left', $._expression),
field('operator', choice('+', '-')),
@@ -184,7 +202,7 @@ module.exports = grammar({
field('operator', choice('*', '/')),
field('right', $._expression),
)),
prec.left(PREC.AND, seq(
prec.left(PREC.COMPOSE, seq(
field('left', $._expression),
field('operator', '&'),
field('right', $._expression),
@@ -21,6 +21,11 @@
"-"
"*"
"/"
"&&"
"||"
"!"
"=="
"!="
"=>"
"="
">"
+155 -8
View File
@@ -716,7 +716,7 @@
},
"call_expression": {
"type": "PREC_LEFT",
"value": 7,
"value": 10,
"content": {
"type": "SEQ",
"members": [
@@ -786,7 +786,7 @@
},
"path_expression": {
"type": "PREC_LEFT",
"value": 8,
"value": 11,
"content": {
"type": "SEQ",
"members": [
@@ -814,8 +814,8 @@
}
},
"comparison_constraint": {
"type": "PREC",
"value": 6,
"type": "PREC_RIGHT",
"value": 10,
"content": {
"type": "SEQ",
"members": [
@@ -857,7 +857,7 @@
},
"unary_expression": {
"type": "PREC",
"value": 6,
"value": 9,
"content": {
"type": "SEQ",
"members": [
@@ -865,8 +865,17 @@
"type": "FIELD",
"name": "operator",
"content": {
"type": "STRING",
"value": "-"
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "-"
},
{
"type": "STRING",
"value": "!"
}
]
}
},
{
@@ -886,6 +895,144 @@
{
"type": "PREC_LEFT",
"value": 4,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "left",
"content": {
"type": "SYMBOL",
"name": "_expression"
}
},
{
"type": "FIELD",
"name": "operator",
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 2,
"content": {
"type": "STRING",
"value": "||"
}
}
}
},
{
"type": "FIELD",
"name": "right",
"content": {
"type": "SYMBOL",
"name": "_expression"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 5,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "left",
"content": {
"type": "SYMBOL",
"name": "_expression"
}
},
{
"type": "FIELD",
"name": "operator",
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 2,
"content": {
"type": "STRING",
"value": "&&"
}
}
}
},
{
"type": "FIELD",
"name": "right",
"content": {
"type": "SYMBOL",
"name": "_expression"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 6,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "left",
"content": {
"type": "SYMBOL",
"name": "_expression"
}
},
{
"type": "FIELD",
"name": "operator",
"content": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "=="
},
{
"type": "STRING",
"value": "!="
},
{
"type": "STRING",
"value": ">"
},
{
"type": "STRING",
"value": ">="
},
{
"type": "STRING",
"value": "<"
},
{
"type": "STRING",
"value": "<="
}
]
}
},
{
"type": "FIELD",
"name": "right",
"content": {
"type": "SYMBOL",
"name": "_expression"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 7,
"content": {
"type": "SEQ",
"members": [
@@ -927,7 +1074,7 @@
},
{
"type": "PREC_LEFT",
"value": 5,
"value": 8,
"content": {
"type": "SEQ",
"members": [
+56
View File
@@ -152,10 +152,18 @@
"multiple": false,
"required": true,
"types": [
{
"type": "!=",
"named": false
},
{
"type": "&",
"named": false
},
{
"type": "&&",
"named": false
},
{
"type": "*",
"named": false
@@ -175,6 +183,30 @@
{
"type": "//",
"named": false
},
{
"type": "<",
"named": false
},
{
"type": "<=",
"named": false
},
{
"type": "==",
"named": false
},
{
"type": ">",
"named": false
},
{
"type": ">=",
"named": false
},
{
"type": "||",
"named": false
}
]
},
@@ -1616,6 +1648,10 @@
"multiple": false,
"required": true,
"types": [
{
"type": "!",
"named": false
},
{
"type": "-",
"named": false
@@ -1624,10 +1660,22 @@
}
}
},
{
"type": "!",
"named": false
},
{
"type": "!=",
"named": false
},
{
"type": "&",
"named": false
},
{
"type": "&&",
"named": false
},
{
"type": "(",
"named": false
@@ -1684,6 +1732,10 @@
"type": "=",
"named": false
},
{
"type": "==",
"named": false
},
{
"type": "=>",
"named": false
@@ -1764,6 +1816,10 @@
"type": "{",
"named": false
},
{
"type": "||",
"named": false
},
{
"type": "}",
"named": false
+5921 -4571
View File
File diff suppressed because it is too large Load Diff