bitwise operations

This commit is contained in:
2026-07-19 00:36:31 +02:00
parent f9448363e4
commit c7e3162ecb
21 changed files with 219439 additions and 140077 deletions
+13 -6
View File
@@ -7,10 +7,12 @@ const PREC = {
OR: 3,
AND: 4,
COMPARE: 5,
SUM: 6,
PRODUCT: 7,
PREFIX: 8,
POSTFIX: 9,
BITWISE: 6,
SHIFT: 7,
SUM: 8,
PRODUCT: 9,
PREFIX: 10,
POSTFIX: 11,
};
module.exports = grammar({
@@ -33,6 +35,9 @@ module.exports = grammar({
[$.block, $.tuple_literal],
[$.field_initializer, $.expression],
[$.tuple_literal],
[$.capture_list, $.expression],
[$.for_statement, $.expression],
[$.match_capture, $.expression],
],
rules: {
@@ -278,7 +283,7 @@ module.exports = grammar({
assignment_statement: $ => seq(
field('left', $.expression),
field('operator', choice('=', '+=', '-=', '*=', '/=')),
field('operator', choice('=', '+=', '-=', '*=', '/=', '&=', '|=', 'xor=', '<<=', '>>=', '<<|=')),
repeat($._newline),
field('right', $._value),
),
@@ -454,6 +459,8 @@ module.exports = grammar({
prec.left(PREC.OR, seq(field('left', $.expression), 'or', repeat($._newline), field('right', $.expression))),
prec.left(PREC.AND, seq(field('left', $.expression), 'and', repeat($._newline), field('right', $.expression))),
prec.left(PREC.COMPARE, seq(field('left', $.expression), field('operator', choice('==', '!=', '<', '<=', '>', '>=')), repeat($._newline), field('right', $.expression))),
prec.left(PREC.BITWISE, seq(field('left', $.expression), field('operator', choice('&', 'xor', '|')), repeat($._newline), field('right', $.expression))),
prec.left(PREC.SHIFT, seq(field('left', $.expression), field('operator', choice('<<', '>>', '<<|')), repeat($._newline), field('right', $.expression))),
prec.left(PREC.SUM, seq(field('left', $.expression), field('operator', choice('+', '-')), repeat($._newline), field('right', $.expression))),
prec.left(PREC.PRODUCT, seq(field('left', $.expression), field('operator', choice('*', '/')), repeat($._newline), field('right', $.expression))),
),
@@ -469,7 +476,7 @@ module.exports = grammar({
)),
unary_expression: $ => prec(PREC.PREFIX, seq(
field('operator', choice('-', '&', '!', '$', 'try')),
field('operator', choice('-', '&', '!', '~', '$', 'try')),
repeat($._newline),
field('operand', $.expression),
)),
@@ -91,6 +91,12 @@
"-="
"*="
"/="
"&="
"|="
"xor="
"<<="
">>="
"<<|="
"=="
"!="
"<"
@@ -101,6 +107,11 @@
"-"
"*"
"/"
"~"
"xor"
"<<"
">>"
"<<|"
"!"
"&"
"@"
+156 -10
View File
@@ -1830,6 +1830,30 @@
{
"type": "STRING",
"value": "/="
},
{
"type": "STRING",
"value": "&="
},
{
"type": "STRING",
"value": "|="
},
{
"type": "STRING",
"value": "xor="
},
{
"type": "STRING",
"value": "<<="
},
{
"type": "STRING",
"value": ">>="
},
{
"type": "STRING",
"value": "<<|="
}
]
}
@@ -3306,6 +3330,112 @@
{
"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": "xor"
},
{
"type": "STRING",
"value": "|"
}
]
}
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_newline"
}
},
{
"type": "FIELD",
"name": "right",
"content": {
"type": "SYMBOL",
"name": "expression"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 7,
"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": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_newline"
}
},
{
"type": "FIELD",
"name": "right",
"content": {
"type": "SYMBOL",
"name": "expression"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 8,
"content": {
"type": "SEQ",
"members": [
@@ -3354,7 +3484,7 @@
},
{
"type": "PREC_LEFT",
"value": 7,
"value": 9,
"content": {
"type": "SEQ",
"members": [
@@ -3466,7 +3596,7 @@
},
"unary_expression": {
"type": "PREC",
"value": 8,
"value": 10,
"content": {
"type": "SEQ",
"members": [
@@ -3488,6 +3618,10 @@
"type": "STRING",
"value": "!"
},
{
"type": "STRING",
"value": "~"
},
{
"type": "STRING",
"value": "$"
@@ -3519,7 +3653,7 @@
},
"field_expression": {
"type": "PREC_LEFT",
"value": 9,
"value": 11,
"content": {
"type": "SEQ",
"members": [
@@ -3557,7 +3691,7 @@
},
"intrinsic_call_expression": {
"type": "PREC",
"value": 9,
"value": 11,
"content": {
"type": "SEQ",
"members": [
@@ -3590,7 +3724,7 @@
},
"call_expression": {
"type": "PREC_LEFT",
"value": 9,
"value": 11,
"content": {
"type": "SEQ",
"members": [
@@ -3615,7 +3749,7 @@
},
"argument_list": {
"type": "PREC",
"value": 9,
"value": 11,
"content": {
"type": "SEQ",
"members": [
@@ -3721,7 +3855,7 @@
},
"index_expression": {
"type": "PREC_LEFT",
"value": 9,
"value": 11,
"content": {
"type": "SEQ",
"members": [
@@ -3768,7 +3902,7 @@
},
"slice_expression": {
"type": "PREC_LEFT",
"value": 9,
"value": 11,
"content": {
"type": "SEQ",
"members": [
@@ -3843,7 +3977,7 @@
},
"postfix_expression": {
"type": "PREC_LEFT",
"value": 9,
"value": 11,
"content": {
"type": "SEQ",
"members": [
@@ -3877,7 +4011,7 @@
},
"struct_literal": {
"type": "PREC",
"value": 9,
"value": 11,
"content": {
"type": "SEQ",
"members": [
@@ -4803,6 +4937,18 @@
],
[
"tuple_literal"
],
[
"capture_list",
"expression"
],
[
"for_statement",
"expression"
],
[
"match_capture",
"expression"
]
],
"precedences": [],
+96
View File
@@ -111,6 +111,10 @@
"multiple": false,
"required": true,
"types": [
{
"type": "&=",
"named": false
},
{
"type": "*=",
"named": false
@@ -127,9 +131,29 @@
"type": "/=",
"named": false
},
{
"type": "<<=",
"named": false
},
{
"type": "<<|=",
"named": false
},
{
"type": "=",
"named": false
},
{
"type": ">>=",
"named": false
},
{
"type": "xor=",
"named": false
},
{
"type": "|=",
"named": false
}
]
},
@@ -191,6 +215,10 @@
"type": "!=",
"named": false
},
{
"type": "&",
"named": false
},
{
"type": "*",
"named": false
@@ -219,6 +247,14 @@
"type": "<",
"named": false
},
{
"type": "<<",
"named": false
},
{
"type": "<<|",
"named": false
},
{
"type": "<=",
"named": false
@@ -235,6 +271,10 @@
"type": ">=",
"named": false
},
{
"type": ">>",
"named": false
},
{
"type": "catch",
"named": false
@@ -242,6 +282,14 @@
{
"type": "orelse",
"named": false
},
{
"type": "xor",
"named": false
},
{
"type": "|",
"named": false
}
]
},
@@ -2187,6 +2235,10 @@
{
"type": "try",
"named": false
},
{
"type": "~",
"named": false
}
]
}
@@ -2422,6 +2474,10 @@
"type": "&",
"named": false
},
{
"type": "&=",
"named": false
},
{
"type": "(",
"named": false
@@ -2498,6 +2554,22 @@
"type": "<",
"named": false
},
{
"type": "<<",
"named": false
},
{
"type": "<<=",
"named": false
},
{
"type": "<<|",
"named": false
},
{
"type": "<<|=",
"named": false
},
{
"type": "<=",
"named": false
@@ -2518,6 +2590,14 @@
"type": ">=",
"named": false
},
{
"type": ">>",
"named": false
},
{
"type": ">>=",
"named": false
},
{
"type": "?",
"named": false
@@ -2839,6 +2919,14 @@
"type": "while",
"named": false
},
{
"type": "xor",
"named": false
},
{
"type": "xor=",
"named": false
},
{
"type": "yield",
"named": false
@@ -2851,8 +2939,16 @@
"type": "|",
"named": false
},
{
"type": "|=",
"named": false
},
{
"type": "}",
"named": false
},
{
"type": "~",
"named": false
}
]
+218100 -140034
View File
File diff suppressed because it is too large Load Diff
+135 -1
View File
@@ -364,7 +364,7 @@ main func() void {
(expression
(sink))
(expression
(identifier))))))))))
(identifier))))))))))
==================
Native tests
@@ -509,3 +509,137 @@ value uint :: 255
(builtin_type))
(expression
(integer))))
==================
Bitwise operations
==================
ops func(value u8, count u8) u8 {
value &= ~u8(1)
value |= 2
value xor= 3
value <<= count
value >>= count
value <<|= count
if (value | 1) |captured| { return captured }
return (value & 15) xor (value << 1) | (value >> 1) | (value <<| 8)
}
---
(source_file
(function_declaration
(identifier)
(parameter_list
(parameter
(identifier)
(type
(builtin_type)))
(parameter
(identifier)
(type
(builtin_type))))
(type
(builtin_type))
(block
(statement
(assignment_statement
(expression
(identifier))
(expression
(unary_expression
(expression
(call_expression
(expression
(builtin_type))
(argument_list
(expression
(integer)))))))))
(statement
(assignment_statement
(expression
(identifier))
(expression
(integer))))
(statement
(assignment_statement
(expression
(identifier))
(expression
(integer))))
(statement
(assignment_statement
(expression
(identifier))
(expression
(identifier))))
(statement
(assignment_statement
(expression
(identifier))
(expression
(identifier))))
(statement
(assignment_statement
(expression
(identifier))
(expression
(identifier))))
(statement
(if_statement
(expression
(parenthesized_expression
(expression
(binary_expression
(expression
(identifier))
(expression
(integer))))))
(capture_list
(identifier))
(statement
(block
(statement
(return_statement
(expression
(identifier))))))))
(statement
(return_statement
(expression
(binary_expression
(expression
(binary_expression
(expression
(binary_expression
(expression
(parenthesized_expression
(expression
(binary_expression
(expression
(identifier))
(expression
(integer))))))
(expression
(parenthesized_expression
(expression
(binary_expression
(expression
(identifier))
(expression
(integer))))))))
(expression
(parenthesized_expression
(expression
(binary_expression
(expression
(identifier))
(expression
(integer))))))))
(expression
(parenthesized_expression
(expression
(binary_expression
(expression
(identifier))
(expression
(integer)))))))))))))
@@ -0,0 +1,14 @@
value u8 = 1
value xor= 2
# ^^^^ operator
value <<|= 3
# ^^^^ operator
masked :: ~value & 15
# ^ operator
# ^ operator
shifted :: value <<| 8
# ^^^ operator