1
0

Add if-then-else expressions

This commit is contained in:
Jip J. Dekker 2021-01-07 17:48:33 +11:00
parent 5004b7fc38
commit 170c3be571
5 changed files with 3186 additions and 1644 deletions

View File

@ -70,6 +70,23 @@ mult_args = my_fn(2, "test");
(assignment_item (identifier) (call (identifier) (integer_literal)))
(assignment_item (identifier) (call (identifier) (integer_literal) (string_literal))))
================
If-Then-Else
================
if_only = if b then i < j endif;
value_select = if b then i else j endif;
elseif = if b then i elseif c then j else k endif;
elseif_no_else = if b then i < j elseif c then j > i endif;
---
(source_file
(assignment_item (identifier) (if_then_else (identifier) (binary_operation (identifier) (identifier))))
(assignment_item (identifier) (if_then_else (identifier) (identifier) (identifier)))
(assignment_item (identifier) (if_then_else (identifier) (identifier) (identifier) (identifier) (identifier)))
(assignment_item (identifier) (if_then_else (identifier) (binary_operation (identifier) (identifier)) (identifier) (binary_operation (identifier) (identifier)))))
================
Index Expression
================

View File

@ -45,6 +45,7 @@ module.exports = grammar({
$.binary_operation,
$.call,
$.if_then_else,
$.index_expression,
$.unary_operation,
// TODO: Other expression types
@ -85,6 +86,14 @@ module.exports = grammar({
')',
)),
if_then_else: $ => seq(
"if", $._expression,
"then", $._expression,
repeat(seq("elseif", $._expression, "then", $._expression)),
optional(seq("else", $._expression)),
"endif",
),
index_expression: $ => prec(PREC.call, seq(
field('collection', $._expression),
'[',

74
src/grammar.json vendored
View File

@ -93,6 +93,10 @@
"type": "SYMBOL",
"name": "call"
},
{
"type": "SYMBOL",
"name": "if_then_else"
},
{
"type": "SYMBOL",
"name": "index_expression"
@ -745,6 +749,76 @@
]
}
},
"if_then_else": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "if"
},
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "STRING",
"value": "then"
},
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "elseif"
},
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "STRING",
"value": "then"
},
{
"type": "SYMBOL",
"name": "_expression"
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "else"
},
{
"type": "SYMBOL",
"name": "_expression"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "endif"
}
]
},
"index_expression": {
"type": "PREC",
"value": 15,

119
src/node-types.json vendored
View File

@ -35,6 +35,10 @@
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
@ -94,6 +98,10 @@
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
@ -164,6 +172,10 @@
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
@ -344,6 +356,10 @@
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
@ -413,6 +429,10 @@
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
@ -447,6 +467,69 @@
}
}
},
{
"type": "if_then_else",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "absent",
"named": true
},
{
"type": "array_literal",
"named": true
},
{
"type": "binary_operation",
"named": true
},
{
"type": "boolean_literal",
"named": true
},
{
"type": "call",
"named": true
},
{
"type": "float_literal",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
},
{
"type": "integer_literal",
"named": true
},
{
"type": "set_literal",
"named": true
},
{
"type": "string_literal",
"named": true
},
{
"type": "unary_operation",
"named": true
}
]
}
},
{
"type": "index_expression",
"named": true,
@ -483,6 +566,10 @@
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
@ -541,6 +628,10 @@
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
@ -601,6 +692,10 @@
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
@ -709,6 +804,10 @@
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "index_expression",
"named": true
@ -852,6 +951,18 @@
"type": "div",
"named": false
},
{
"type": "else",
"named": false
},
{
"type": "elseif",
"named": false
},
{
"type": "endif",
"named": false
},
{
"type": "escape_sequence",
"named": true
@ -868,6 +979,10 @@
"type": "identifier",
"named": true
},
{
"type": "if",
"named": false
},
{
"type": "in",
"named": false
@ -900,6 +1015,10 @@
"type": "symdiff",
"named": false
},
{
"type": "then",
"named": false
},
{
"type": "true",
"named": false

4611
src/parser.c vendored

File diff suppressed because it is too large Load Diff