add operation expressions

This commit is contained in:
mhoffm
2021-06-13 09:17:52 +02:00
parent d04993a05a
commit 3bba72f836
4 changed files with 6257 additions and 3588 deletions

View File

@@ -51,7 +51,7 @@ module.exports = grammar({
expression: $ => choice( expression: $ => choice(
$.expr_term, $.expr_term,
//$.operation, $.operation,
$.conditional, $.conditional,
), ),
@@ -198,6 +198,26 @@ module.exports = grammar({
$.expression, $.expression,
), ),
operation: $ => choice($.unary_operation, $.binary_operation),
unary_operation: $ => prec.left(7, seq(choice('-', '!'), $.expr_term)),
binary_operation: $ => {
const table = [
[6, choice('*', '/', '%')],
[5, choice('+', '-')],
[4, choice('>', '>=', '<', '<=')],
[3, choice('==', '!=')],
[2, choice('&&')],
[1, choice('||')],
];
return choice(...table.map(([precedence, operator]) =>
prec.left(precedence, seq($.expr_term, operator, $.expr_term),
))
);
},
// http://stackoverflow.com/questions/13014947/regex-to-match-a-c-style-multiline-comment/36328890#36328890 // http://stackoverflow.com/questions/13014947/regex-to-match-a-c-style-multiline-comment/36328890#36328890
comment: $ => token(choice( comment: $ => token(choice(
seq('#', /.*/), seq('#', /.*/),

View File

@@ -135,6 +135,10 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "expr_term" "name": "expr_term"
}, },
{
"type": "SYMBOL",
"name": "operation"
},
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "conditional" "name": "conditional"
@@ -854,6 +858,234 @@
} }
] ]
}, },
"operation": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "unary_operation"
},
{
"type": "SYMBOL",
"name": "binary_operation"
}
]
},
"unary_operation": {
"type": "PREC_LEFT",
"value": 7,
"content": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "-"
},
{
"type": "STRING",
"value": "!"
}
]
},
{
"type": "SYMBOL",
"name": "expr_term"
}
]
}
},
"binary_operation": {
"type": "CHOICE",
"members": [
{
"type": "PREC_LEFT",
"value": 6,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expr_term"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "*"
},
{
"type": "STRING",
"value": "/"
},
{
"type": "STRING",
"value": "%"
}
]
},
{
"type": "SYMBOL",
"name": "expr_term"
}
]
}
},
{
"type": "PREC_LEFT",
"value": 5,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expr_term"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "+"
},
{
"type": "STRING",
"value": "-"
}
]
},
{
"type": "SYMBOL",
"name": "expr_term"
}
]
}
},
{
"type": "PREC_LEFT",
"value": 4,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expr_term"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ">"
},
{
"type": "STRING",
"value": ">="
},
{
"type": "STRING",
"value": "<"
},
{
"type": "STRING",
"value": "<="
}
]
},
{
"type": "SYMBOL",
"name": "expr_term"
}
]
}
},
{
"type": "PREC_LEFT",
"value": 3,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expr_term"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "=="
},
{
"type": "STRING",
"value": "!="
}
]
},
{
"type": "SYMBOL",
"name": "expr_term"
}
]
}
},
{
"type": "PREC_LEFT",
"value": 2,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expr_term"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "&&"
}
]
},
{
"type": "SYMBOL",
"name": "expr_term"
}
]
}
},
{
"type": "PREC_LEFT",
"value": 1,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expr_term"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "||"
}
]
},
{
"type": "SYMBOL",
"name": "expr_term"
}
]
}
}
]
},
"comment": { "comment": {
"type": "TOKEN", "type": "TOKEN",
"content": { "content": {

View File

@@ -40,6 +40,21 @@
] ]
} }
}, },
{
"type": "binary_operation",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expr_term",
"named": true
}
]
}
},
{ {
"type": "block", "type": "block",
"named": true, "named": true,
@@ -213,6 +228,10 @@
{ {
"type": "expr_term", "type": "expr_term",
"named": true "named": true
},
{
"type": "operation",
"named": true
} }
] ]
} }
@@ -475,6 +494,25 @@
] ]
} }
}, },
{
"type": "operation",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "binary_operation",
"named": true
},
{
"type": "unary_operation",
"named": true
}
]
}
},
{ {
"type": "splat", "type": "splat",
"named": true, "named": true,
@@ -524,6 +562,21 @@
] ]
} }
}, },
{
"type": "unary_operation",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "expr_term",
"named": true
}
]
}
},
{ {
"type": "variable_expr", "type": "variable_expr",
"named": true, "named": true,
@@ -539,10 +592,26 @@
] ]
} }
}, },
{
"type": "!",
"named": false
},
{
"type": "!=",
"named": false
},
{ {
"type": "\"", "type": "\"",
"named": false "named": false
}, },
{
"type": "%",
"named": false
},
{
"type": "&&",
"named": false
},
{ {
"type": "(", "type": "(",
"named": false "named": false
@@ -555,26 +624,58 @@
"type": "*", "type": "*",
"named": false "named": false
}, },
{
"type": "+",
"named": false
},
{ {
"type": ",", "type": ",",
"named": false "named": false
}, },
{
"type": "-",
"named": false
},
{ {
"type": ".", "type": ".",
"named": false "named": false
}, },
{
"type": "/",
"named": false
},
{ {
"type": ":", "type": ":",
"named": false "named": false
}, },
{
"type": "<",
"named": false
},
{
"type": "<=",
"named": false
},
{ {
"type": "=", "type": "=",
"named": false "named": false
}, },
{
"type": "==",
"named": false
},
{ {
"type": "=>", "type": "=>",
"named": false "named": false
}, },
{
"type": ">",
"named": false
},
{
"type": ">=",
"named": false
},
{ {
"type": "?", "type": "?",
"named": false "named": false
@@ -635,6 +736,10 @@
"type": "{", "type": "{",
"named": false "named": false
}, },
{
"type": "||",
"named": false
},
{ {
"type": "}", "type": "}",
"named": false "named": false

File diff suppressed because it is too large Load Diff