Extend loop macro and defun

pull/70/head
Stephan Seitz 2021-04-03 22:37:12 +07:00
parent cc0a1401cf
commit 75161e7a7e
5 changed files with 28541 additions and 19147 deletions

@ -19,11 +19,22 @@ const PREC = {
SPECIAL: 2,
}
const SYMBOL_HEAD =
/[^\f\n\r\t ()\[\]{}"@~^;`\\,:#'0-9\u000B\u001C\u001D\u001E\u001F\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2008\u2009\u200a\u205f\u3000]/;
const SYMBOL_BODY =
choice(SYMBOL_HEAD,
/[#':0-9]/);
const SYMBOL =
token(seq(SYMBOL_HEAD,
repeat(SYMBOL_BODY)));
module.exports = grammar(clojure, {
name: 'commonlisp',
extras: ($, original) => [...original, $.block_comment],
conflicts: ($, original) => [...original, [$.for_clause], [$.accumulation_clause]],
conflicts: ($, original) => [...original, [$.for_clause], [$.accumulation_clause], [$.do_clause]],
rules: {
block_comment: _ => token(seq('#|', repeat(choice(/[^|]/, /\|[^#]/)), '|#')),
@ -56,16 +67,18 @@ module.exports = grammar(clojure, {
repeat(choice(field('value', $._form), $._gap)),
field('close', ")")),
_for_part: $ => seq(optional($._gap), choice('in', 'across', 'being', 'using', /being the (hash-key[s]?|hash-value[s]?) in/, 'below', 'from', 'to', 'upto', 'downto', 'downfrom', 'on', 'by', 'then'),
_for_part: $ => seq(optional($._gap), choice('in', 'across', 'being', 'using', /being the (hash-key[s]?|hash-value[s]?) in/, 'below', 'from', 'to', 'upto', 'downto', 'downfrom', 'on', 'by', 'then', '='),
optional($._gap), $._form),
accumulation_verb: _ => /(collect|append|nconc|count|sum|maximize|minimize)(ing)?/,
accumulation_verb: _ => /((collect|append|nconc|count|maximize|minimize)(ing)?|sum(ming)?)/,
for_clause: $ => seq(choice('for', 'and'), optional($._gap), field('variable', $._form),
$._for_part, optional($._for_part)),
for_clause: $ => seq(choice('for', 'and', 'as'), optional($._gap), field('variable', $._form),
repeat1($._for_part)),
with_clause: $ => prec.left(seq('with', optional($._gap), $._form, optional($._gap), "=", optional($._gap), $._form)),
do_clause: $ => prec.left(seq('do', optional($._gap), $._form)),
do_clause: $ => prec.left(seq('do', repeat(seq(optional($._gap), $._form)))),
while_clause: $ => prec.left(seq('while', optional($._gap), $._form)),
repeat_clause: $ => prec.left(seq('repeat', optional($._gap), $._form)),
condition_clause: $ => prec.left(seq(choice('when', 'if', 'unless', 'always', 'thereis', 'never'), optional($._gap), $._form)),
accumulation_clause: $ => seq($.accumulation_verb, optional($._gap), $._form, optional(seq(optional($._gap), 'into', optional($._gap), $._form))),
termination_clause: $ => prec.left(seq(choice('finally', 'return', 'initially'), optional($._gap), $._form)),
@ -75,27 +88,35 @@ module.exports = grammar(clojure, {
seq(choice(
$.for_clause,
$.do_clause,
$.while_clause,
$.accumulation_clause,
$.condition_clause,
$.with_clause,
$.termination_clause,
$.while_clause,
)),
loop_macro: $ =>
seq(field('open', "("),
optional($._gap),
optional('cl:'),
'loop',
repeat(choice($.loop_clause, $._gap)),
field('close', ")")),
defun_keyword: _ => choice('defun', 'defmacro'),
defun_keyword: _ => choice('defun', 'defmacro', 'defgeneric', 'defmethod'),
defun_header: $ =>
seq(field('keyword', $.defun_keyword),
repeat($._gap),
field('function_name', $._form),
repeat($._gap),
field('lambda_list', $.list_lit)),
choice(
seq(field('keyword', $.defun_keyword),
repeat($._gap),
field('function_name', $._form),
repeat($._gap),
field('lambda_list', $.list_lit)),
seq(field('keyword', alias('lambda', $.defun_keyword)),
repeat($._gap),
field('lambda_list', $.list_lit))
),
array_dimension: $ => seq($.num_lit, 'A'),
@ -142,5 +163,10 @@ module.exports = grammar(clojure, {
$.syn_quoting_lit,
$.unquote_splicing_lit,
$.unquoting_lit),
sym_lit: $ =>
seq(repeat($._metadata_lit),
SYMBOL),
}
});

@ -722,7 +722,7 @@
},
{
"type": "PATTERN",
"value": "[:#'0-9]"
"value": "[#':0-9]"
}
]
}
@ -1849,6 +1849,10 @@
{
"type": "STRING",
"value": "then"
},
{
"type": "STRING",
"value": "="
}
]
},
@ -1872,7 +1876,7 @@
},
"accumulation_verb": {
"type": "PATTERN",
"value": "(collect|append|nconc|count|sum|maximize|minimize)(ing)?"
"value": "((collect|append|nconc|count|maximize|minimize)(ing)?|sum(ming)?)"
},
"for_clause": {
"type": "SEQ",
@ -1887,6 +1891,10 @@
{
"type": "STRING",
"value": "and"
},
{
"type": "STRING",
"value": "as"
}
]
},
@ -1911,20 +1919,11 @@
}
},
{
"type": "SYMBOL",
"name": "_for_part"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_for_part"
},
{
"type": "BLANK"
}
]
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "_for_part"
}
}
]
},
@ -1999,6 +1998,72 @@
"type": "STRING",
"value": "do"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_gap"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "_form"
}
]
}
}
]
}
},
"while_clause": {
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "while"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_gap"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "_form"
}
]
}
},
"repeat_clause": {
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "repeat"
},
{
"type": "CHOICE",
"members": [
@ -2198,6 +2263,10 @@
"type": "SYMBOL",
"name": "do_clause"
},
{
"type": "SYMBOL",
"name": "while_clause"
},
{
"type": "SYMBOL",
"name": "accumulation_clause"
@ -2213,6 +2282,10 @@
{
"type": "SYMBOL",
"name": "termination_clause"
},
{
"type": "SYMBOL",
"name": "while_clause"
}
]
}
@ -2241,6 +2314,18 @@
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "cl:"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "loop"
@ -2281,49 +2366,95 @@
{
"type": "STRING",
"value": "defmacro"
},
{
"type": "STRING",
"value": "defgeneric"
},
{
"type": "STRING",
"value": "defmethod"
}
]
},
"defun_header": {
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "keyword",
"content": {
"type": "SYMBOL",
"name": "defun_keyword"
}
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_gap"
}
},
{
"type": "FIELD",
"name": "function_name",
"content": {
"type": "SYMBOL",
"name": "_form"
}
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_gap"
}
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "keyword",
"content": {
"type": "SYMBOL",
"name": "defun_keyword"
}
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_gap"
}
},
{
"type": "FIELD",
"name": "function_name",
"content": {
"type": "SYMBOL",
"name": "_form"
}
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_gap"
}
},
{
"type": "FIELD",
"name": "lambda_list",
"content": {
"type": "SYMBOL",
"name": "list_lit"
}
}
]
},
{
"type": "FIELD",
"name": "lambda_list",
"content": {
"type": "SYMBOL",
"name": "list_lit"
}
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "keyword",
"content": {
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "lambda"
},
"named": true,
"value": "defun_keyword"
}
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_gap"
}
},
{
"type": "FIELD",
"name": "lambda_list",
"content": {
"type": "SYMBOL",
"name": "list_lit"
}
}
]
}
]
},
@ -2353,6 +2484,9 @@
],
[
"accumulation_clause"
],
[
"do_clause"
]
],
"precedences": [],

@ -352,7 +352,7 @@
"fields": {
"function_name": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "char_lit",
@ -735,7 +735,7 @@
"fields": {},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "char_lit",
@ -1264,6 +1264,10 @@
"type": "termination_clause",
"named": true
},
{
"type": "while_clause",
"named": true
},
{
"type": "with_clause",
"named": true
@ -2976,6 +2980,105 @@
]
}
},
{
"type": "while_clause",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "char_lit",
"named": true
},
{
"type": "comment",
"named": true
},
{
"type": "derefing_lit",
"named": true
},
{
"type": "dis_expr",
"named": true
},
{
"type": "evaling_lit",
"named": true
},
{
"type": "fancy_literal",
"named": true
},
{
"type": "kwd_lit",
"named": true
},
{
"type": "list_lit",
"named": true
},
{
"type": "nil_lit",
"named": true
},
{
"type": "num_lit",
"named": true
},
{
"type": "quoting_lit",
"named": true
},
{
"type": "read_cond_lit",
"named": true
},
{
"type": "set_lit",
"named": true
},
{
"type": "splicing_read_cond_lit",
"named": true
},
{
"type": "str_lit",
"named": true
},
{
"type": "sym_lit",
"named": true
},
{
"type": "sym_val_lit",
"named": true
},
{
"type": "syn_quoting_lit",
"named": true
},
{
"type": "unquote_splicing_lit",
"named": true
},
{
"type": "unquoting_lit",
"named": true
},
{
"type": "var_quoting_lit",
"named": true
},
{
"type": "vec_lit",
"named": true
}
]
}
},
{
"type": "with_clause",
"named": true,
@ -3167,6 +3270,10 @@
"type": "and",
"named": false
},
{
"type": "as",
"named": false
},
{
"type": "auto_res_mark",
"named": true
@ -3191,14 +3298,26 @@
"type": "char_lit",
"named": true
},
{
"type": "cl:",
"named": false
},
{
"type": "comment",
"named": true
},
{
"type": "defgeneric",
"named": false
},
{
"type": "defmacro",
"named": false
},
{
"type": "defmethod",
"named": false
},
{
"type": "defun",
"named": false
@ -3271,6 +3390,10 @@
"type": "on",
"named": false
},
{
"type": "repeat",
"named": false
},
{
"type": "return",
"named": false
@ -3303,6 +3426,10 @@
"type": "when",
"named": false
},
{
"type": "while",
"named": false
},
{
"type": "with",
"named": false

File diff suppressed because it is too large Load Diff

@ -109,3 +109,9 @@ Loop Macro (Accumulation)
collect x into a)
---
(source (list_lit (loop_macro (loop_clause (for_clause (sym_lit) (num_lit))) (loop_clause (accumulation_clause (accumulation_verb) (sym_lit) (sym_lit))))))
==========================================
Decimals
==========================================
#(2 2 .2 3 2 2 2 3 3)