Add if-then-else expressions
This commit is contained in:
parent
5004b7fc38
commit
170c3be571
@ -70,6 +70,23 @@ mult_args = my_fn(2, "test");
|
|||||||
(assignment_item (identifier) (call (identifier) (integer_literal)))
|
(assignment_item (identifier) (call (identifier) (integer_literal)))
|
||||||
(assignment_item (identifier) (call (identifier) (integer_literal) (string_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
|
Index Expression
|
||||||
================
|
================
|
||||||
|
@ -45,6 +45,7 @@ module.exports = grammar({
|
|||||||
|
|
||||||
$.binary_operation,
|
$.binary_operation,
|
||||||
$.call,
|
$.call,
|
||||||
|
$.if_then_else,
|
||||||
$.index_expression,
|
$.index_expression,
|
||||||
$.unary_operation,
|
$.unary_operation,
|
||||||
// TODO: Other expression types
|
// 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(
|
index_expression: $ => prec(PREC.call, seq(
|
||||||
field('collection', $._expression),
|
field('collection', $._expression),
|
||||||
'[',
|
'[',
|
||||||
|
74
src/grammar.json
vendored
74
src/grammar.json
vendored
@ -93,6 +93,10 @@
|
|||||||
"type": "SYMBOL",
|
"type": "SYMBOL",
|
||||||
"name": "call"
|
"name": "call"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "if_then_else"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "SYMBOL",
|
"type": "SYMBOL",
|
||||||
"name": "index_expression"
|
"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": {
|
"index_expression": {
|
||||||
"type": "PREC",
|
"type": "PREC",
|
||||||
"value": 15,
|
"value": 15,
|
||||||
|
119
src/node-types.json
vendored
119
src/node-types.json
vendored
@ -35,6 +35,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if_then_else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "index_expression",
|
"type": "index_expression",
|
||||||
"named": true
|
"named": true
|
||||||
@ -94,6 +98,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if_then_else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "index_expression",
|
"type": "index_expression",
|
||||||
"named": true
|
"named": true
|
||||||
@ -164,6 +172,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if_then_else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "index_expression",
|
"type": "index_expression",
|
||||||
"named": true
|
"named": true
|
||||||
@ -344,6 +356,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if_then_else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "index_expression",
|
"type": "index_expression",
|
||||||
"named": true
|
"named": true
|
||||||
@ -413,6 +429,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if_then_else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "index_expression",
|
"type": "index_expression",
|
||||||
"named": true
|
"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",
|
"type": "index_expression",
|
||||||
"named": true,
|
"named": true,
|
||||||
@ -483,6 +566,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if_then_else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "index_expression",
|
"type": "index_expression",
|
||||||
"named": true
|
"named": true
|
||||||
@ -541,6 +628,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if_then_else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "index_expression",
|
"type": "index_expression",
|
||||||
"named": true
|
"named": true
|
||||||
@ -601,6 +692,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if_then_else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "index_expression",
|
"type": "index_expression",
|
||||||
"named": true
|
"named": true
|
||||||
@ -709,6 +804,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if_then_else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "index_expression",
|
"type": "index_expression",
|
||||||
"named": true
|
"named": true
|
||||||
@ -852,6 +951,18 @@
|
|||||||
"type": "div",
|
"type": "div",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "else",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "elseif",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endif",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "escape_sequence",
|
"type": "escape_sequence",
|
||||||
"named": true
|
"named": true
|
||||||
@ -868,6 +979,10 @@
|
|||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "if",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "in",
|
"type": "in",
|
||||||
"named": false
|
"named": false
|
||||||
@ -900,6 +1015,10 @@
|
|||||||
"type": "symdiff",
|
"type": "symdiff",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "then",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "true",
|
"type": "true",
|
||||||
"named": false
|
"named": false
|
||||||
|
4611
src/parser.c
vendored
4611
src/parser.c
vendored
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user