1
0

Add generator calls

This commit is contained in:
Jip J. Dekker 2021-01-11 13:45:00 +11:00
parent d096c1f831
commit b1cfdb1088
5 changed files with 3871 additions and 2929 deletions

View File

@ -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

View File

@ -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
View File

@ -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
View File

@ -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

File diff suppressed because it is too large Load Diff