add for expressions

This commit is contained in:
mhoffm
2021-06-08 22:32:42 +02:00
parent cf3ffa5226
commit 4a0db3b31c
5 changed files with 3378 additions and 1193 deletions

View File

@@ -13,7 +13,10 @@ module.exports = grammar({
[$.full_splat], [$.full_splat],
], ],
extras: $ => [$.comment, /\s/], extras: $ => [
$.comment,
/\s/,
],
rules: { rules: {
config_file: $ => $.body, config_file: $ => $.body,
@@ -28,7 +31,7 @@ module.exports = grammar({
attribute: $ => seq( attribute: $ => seq(
field('name', $.identifier), field('name', $.identifier),
'=', '=',
$.expression $.expression,
), ),
block: $ => seq( block: $ => seq(
@@ -42,7 +45,7 @@ module.exports = grammar({
// TODO: not to spec but good enough for now // TODO: not to spec but good enough for now
identifier: $ => token(seq( identifier: $ => token(seq(
unicodeLetter, unicodeLetter,
repeat(choice(unicodeLetter, unicodeDigit, unicodePunctuation)) repeat(choice(unicodeLetter, unicodeDigit, unicodePunctuation)),
)), )),
expression: $ => choice( expression: $ => choice(
@@ -56,7 +59,7 @@ module.exports = grammar({
$.collection_value, $.collection_value,
$.variable_expr, $.variable_expr,
// $.function_call, // $.function_call,
// $.for_expr, $.for_expr,
seq($.expr_term, $.index), seq($.expr_term, $.index),
seq($.expr_term, $.get_attr), seq($.expr_term, $.get_attr),
seq($.expr_term, $.splat), seq($.expr_term, $.splat),
@@ -114,8 +117,41 @@ module.exports = grammar({
splat: $ => choice($.attr_splat, $.full_splat), splat: $ => choice($.attr_splat, $.full_splat),
attr_splat: $ => seq('.', '*', repeat($.get_attr)), attr_splat: $ => seq('.', '*', repeat($.get_attr)),
full_splat: $ => seq('[', '*', ']', repeat(choice($.get_attr, $.index))), full_splat: $ => seq('[', '*', ']', repeat(choice($.get_attr, $.index))),
for_expr: $ => choice($.for_tuple_expr, $.for_object_expr),
for_tuple_expr: $ => seq(
'[',
$.for_intro,
$.expression,
optional($.for_cond),
']',
),
for_object_expr: $ => seq(
'{',
$.for_intro,
$.expression,
'=>',
$.expression,
optional('...'),
optional($.for_cond),
'}',
),
for_intro: $ => seq(
'for',
$.identifier,
optional(seq(',', $.identifier)),
'in',
$.expression,
':',
),
for_cond: $ => seq('if', $.expression),
variable_expr: $ => $.identifier, variable_expr: $ => $.identifier,
// 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

View File

@@ -8,4 +8,5 @@
(bool_lit) @boolean (bool_lit) @boolean
(null_lit) @null (null_lit) @null
(comment) @comment (comment) @comment
(for_intro) @keyword

View File

@@ -152,6 +152,10 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "variable_expr" "name": "variable_expr"
}, },
{
"type": "SYMBOL",
"name": "for_expr"
},
{ {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
@@ -517,6 +521,164 @@
} }
] ]
}, },
"for_expr": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "for_tuple_expr"
},
{
"type": "SYMBOL",
"name": "for_object_expr"
}
]
},
"for_tuple_expr": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "["
},
{
"type": "SYMBOL",
"name": "for_intro"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "for_cond"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "]"
}
]
},
"for_object_expr": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "SYMBOL",
"name": "for_intro"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "=>"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "..."
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "for_cond"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "}"
}
]
},
"for_intro": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "for"
},
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "identifier"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "in"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": ":"
}
]
},
"for_cond": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "if"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
},
"variable_expr": { "variable_expr": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "identifier" "name": "identifier"

View File

@@ -152,6 +152,10 @@
"type": "expression", "type": "expression",
"named": true "named": true
}, },
{
"type": "for_expr",
"named": true
},
{ {
"type": "get_attr", "type": "get_attr",
"named": true "named": true
@@ -190,6 +194,105 @@
] ]
} }
}, },
{
"type": "for_cond",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "for_expr",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "for_object_expr",
"named": true
},
{
"type": "for_tuple_expr",
"named": true
}
]
}
},
{
"type": "for_intro",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
},
{
"type": "identifier",
"named": true
}
]
}
},
{
"type": "for_object_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
},
{
"type": "for_cond",
"named": true
},
{
"type": "for_intro",
"named": true
}
]
}
},
{
"type": "for_tuple_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
},
{
"type": "for_cond",
"named": true
},
{
"type": "for_intro",
"named": true
}
]
}
},
{ {
"type": "full_splat", "type": "full_splat",
"named": true, "named": true,
@@ -378,6 +481,10 @@
"type": ".", "type": ".",
"named": false "named": false
}, },
{
"type": "...",
"named": false
},
{ {
"type": ":", "type": ":",
"named": false "named": false
@@ -386,6 +493,10 @@
"type": "=", "type": "=",
"named": false "named": false
}, },
{
"type": "=>",
"named": false
},
{ {
"type": "[", "type": "[",
"named": false "named": false
@@ -402,10 +513,22 @@
"type": "false", "type": "false",
"named": false "named": false
}, },
{
"type": "for",
"named": false
},
{ {
"type": "identifier", "type": "identifier",
"named": true "named": true
}, },
{
"type": "if",
"named": false
},
{
"type": "in",
"named": false
},
{ {
"type": "null_lit", "type": "null_lit",
"named": true "named": true

File diff suppressed because it is too large Load Diff