bitwise operations
This commit is contained in:
@@ -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"
|
||||
"<<"
|
||||
">>"
|
||||
"<<|"
|
||||
"!"
|
||||
"&"
|
||||
"@"
|
||||
|
||||
@@ -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": [],
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
Reference in New Issue
Block a user