Add generator calls
This commit is contained in:
parent
d096c1f831
commit
b1cfdb1088
@ -20,13 +20,28 @@ Call
|
||||
no_args = my_fn();
|
||||
single_arg = my_fn(1);
|
||||
mult_args = my_fn(2, "test");
|
||||
generator_lookalike = my_fn(x in Xs)
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(assignment (identifier) (call (identifier)))
|
||||
(assignment (identifier) (call (identifier) (integer_literal)))
|
||||
(assignment (identifier) (call (identifier) (integer_literal) (string_literal))))
|
||||
(assignment (identifier) (call (identifier) (integer_literal) (string_literal)))
|
||||
(assignment (identifier) (call (identifier) (infix_operator (identifier) (identifier)))))
|
||||
|
||||
==============
|
||||
Generator Call
|
||||
==============
|
||||
|
||||
simple_sum = sum(i in N)(i);
|
||||
selective_sum = sum(i in N where i in X)(i);
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(assignment (identifier) (generator_call (identifier) (generator (identifier) (identifier)) (identifier)))
|
||||
(assignment (identifier) (generator_call (identifier) (generator (identifier) (identifier) (infix_operator (identifier) (identifier))) (identifier))))
|
||||
|
||||
============
|
||||
If-Then-Else
|
||||
|
14
grammar.js
14
grammar.js
@ -25,6 +25,10 @@ module.exports = grammar({
|
||||
|
||||
word: $ => $.identifier,
|
||||
|
||||
conflicts: $ => [
|
||||
[$._expression, $.generator],
|
||||
],
|
||||
|
||||
rules: {
|
||||
source_file: $ => seq(sepBy(';', $._item)),
|
||||
|
||||
@ -45,6 +49,7 @@ module.exports = grammar({
|
||||
|
||||
$.array_comprehension,
|
||||
$.call,
|
||||
$.generator_call,
|
||||
$.if_then_else,
|
||||
$.indexed_access,
|
||||
$.infix_operator,
|
||||
@ -65,6 +70,15 @@ module.exports = grammar({
|
||||
')',
|
||||
)),
|
||||
|
||||
generator_call: $ => prec(PREC.call, seq(
|
||||
field('name', $.identifier),
|
||||
'(',
|
||||
field('generators', sepBy1(',', $.generator)),
|
||||
')', '(',
|
||||
field('template', $._expression),
|
||||
')',
|
||||
)),
|
||||
|
||||
generator: $ => seq(
|
||||
$.identifier, 'in', $._expression,
|
||||
optional(seq('where', $._expression))
|
||||
|
93
src/grammar.json
vendored
93
src/grammar.json
vendored
@ -93,6 +93,10 @@
|
||||
"type": "SYMBOL",
|
||||
"name": "call"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "generator_call"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "if_then_else"
|
||||
@ -252,6 +256,88 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"generator_call": {
|
||||
"type": "PREC",
|
||||
"value": 15,
|
||||
"content": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "name",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "("
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "generators",
|
||||
"content": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "generator"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "generator"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ")"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "("
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "template",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_expression"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ")"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"generator": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
@ -1396,7 +1482,12 @@
|
||||
"name": "block_comment"
|
||||
}
|
||||
],
|
||||
"conflicts": [],
|
||||
"conflicts": [
|
||||
[
|
||||
"_expression",
|
||||
"generator"
|
||||
]
|
||||
],
|
||||
"externals": [],
|
||||
"inline": [],
|
||||
"supertypes": []
|
||||
|
160
src/node-types.json
vendored
160
src/node-types.json
vendored
@ -35,6 +35,10 @@
|
||||
"type": "generator",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -106,6 +110,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -185,6 +193,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -284,6 +296,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -366,6 +382,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -405,6 +425,114 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"generators": {
|
||||
"multiple": true,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": ",",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "generator",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"name": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"template": {
|
||||
"multiple": true,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "(",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": ")",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "absent",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_comprehension",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "boolean_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "if_then_else",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "indexed_access",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "infix_operator",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "prefix_operator",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "set_comprehension",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "if_then_else",
|
||||
"named": true,
|
||||
@ -437,6 +565,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -516,6 +648,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -594,6 +730,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -674,6 +814,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -874,6 +1018,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -965,6 +1113,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -1040,6 +1192,10 @@
|
||||
"type": "generator",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
@ -1111,6 +1267,10 @@
|
||||
"type": "float_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "generator_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
|
6516
src/parser.c
vendored
6516
src/parser.c
vendored
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user