Add special list defun

pull/70/head
Stephan Seitz 2021-04-03 00:24:41 +07:00
parent 05f5b856d6
commit a9d8b569ea
5 changed files with 11482 additions and 5131 deletions

@ -9,85 +9,110 @@
const clojure = require("tree-sitter-clojure/grammar");
const WHITESPACE_CHAR =
/[\f\n\r\t \u000B\u001C\u001D\u001E\u001F\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2008\u2009\u200a\u205f\u3000]/;
/[\f\n\r\t \u000B\u001C\u001D\u001E\u001F\u2028\u2029\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2008\u2009\u200a\u205f\u3000]/;
const WHITESPACE =
token(repeat1(WHITESPACE_CHAR));
token(repeat1(WHITESPACE_CHAR));
const PREC = {
NORMAL: 1,
SPECIAL: 2,
}
module.exports = grammar(clojure, {
name: 'commonlisp',
extras: ($, original) => [...original, $.block_comment],
conflicts: (_, original) => [...original],
rules: {
block_comment: _ => token(seq('#|', repeat(choice(/[^|]/, /\|[^#]/)) ,'|#')),
fancy_literal: _ => token(seq('|', repeat(/[^|]/) ,'|')),
_ws: _ =>
WHITESPACE,
unquoting_lit: $ =>
seq(field('marker', ","),
repeat($._gap),
field('value', $._form)),
unquote_splicing_lit: $ =>
seq(repeat($._metadata_lit),
field('marker', ",@"),
repeat($._gap),
field('value', $._form)),
syn_quoting_lit: $ =>
seq(field('marker', "`"),
repeat($._gap),
field('value', $.list_lit)),
//defun_header: $ =>
//seq(field('keyword', 'defun'),
//repeat($._gap),
//field('function_name', $._form),
//repeat($._gap),
//field('lambda_list', $.list_lit)),
//
array_dimension: $ => seq($.num_lit, 'A'),
_bare_vec_lit: $ =>
choice(seq(field('open', '#0A'), $.num_lit),
seq(field('open', '#'), optional(field('dimension_indicator', $.array_dimension)), $.list_lit)),
_form: $ =>
choice(// atom-ish
$.num_lit,
$.fancy_literal,
//$.defun_header,
$.kwd_lit,
$.str_lit,
$.char_lit,
$.nil_lit,
//$.bool_lit,
$.sym_lit,
// basic collection-ish
$.list_lit,
//$.map_lit,
$.vec_lit,
// dispatch reader macros
$.set_lit,
//$.anon_fn_lit,
//$.regex_lit,
$.read_cond_lit,
$.splicing_read_cond_lit,
//$.ns_map_lit,
$.var_quoting_lit,
$.sym_val_lit,
$.evaling_lit,
//$.tagged_or_ctor_lit,
// some other reader macros
$.derefing_lit,
$.quoting_lit,
$.syn_quoting_lit,
$.unquote_splicing_lit,
$.unquoting_lit),
}
name: 'commonlisp',
extras: ($, original) => [...original, $.block_comment],
conflicts: (_, original) => [...original],
rules: {
block_comment: _ => token(seq('#|', repeat(choice(/[^|]/, /\|[^#]/)), '|#')),
fancy_literal: _ => token(seq('|', repeat(/[^|]/), '|')),
_ws: _ =>
WHITESPACE,
unquoting_lit: $ =>
seq(field('marker', ","),
repeat($._gap),
field('value', $._form)),
unquote_splicing_lit: $ =>
seq(repeat($._metadata_lit),
field('marker', ",@"),
repeat($._gap),
field('value', $._form)),
syn_quoting_lit: $ =>
seq(field('marker', "`"),
repeat($._gap),
field('value', $.list_lit)),
defun: $ =>
seq(field('open', "("),
optional($._gap),
$.defun_header,
repeat(choice(field('value', $._form), $._gap)),
field('close', ")")),
defun_keyword: _ => choice('defun', 'defmacro'),
defun_header: $ =>
seq(field('keyword', $.defun_keyword),
repeat($._gap),
field('function_name', $._form),
repeat($._gap),
field('lambda_list', $.list_lit)),
array_dimension: $ => seq($.num_lit, 'A'),
_bare_vec_lit: $ =>
choice(seq(field('open', '#0A'), $.num_lit),
seq(field('open', '#'), optional(field('dimension_indicator', $.array_dimension)), $.list_lit)),
_bare_list_lit: $ =>
choice(prec(PREC.SPECIAL, $.defun),
seq(field('open', "("),
repeat(choice(field('value', $._form), $._gap)),
field('close', ")"))),
_first_form: $ =>
choice(
prec(PREC.SPECIAL, $.defun_header),
$._form),
_form: $ =>
choice(// atom-ish
$.num_lit,
$.fancy_literal,
//$.defun_header,
$.kwd_lit,
$.str_lit,
$.char_lit,
$.nil_lit,
//$.bool_lit,
$.sym_lit,
// basic collection-ish
$.list_lit,
//$.map_lit,
$.vec_lit,
// dispatch reader macros
$.set_lit,
//$.anon_fn_lit,
//$.regex_lit,
$.read_cond_lit,
$.splicing_read_cond_lit,
//$.ns_map_lit,
$.var_quoting_lit,
$.sym_val_lit,
$.evaling_lit,
//$.tagged_or_ctor_lit,
// some other reader macros
$.derefing_lit,
$.quoting_lit,
$.syn_quoting_lit,
$.unquote_splicing_lit,
$.unquoting_lit),
}
});

@ -888,43 +888,56 @@
]
},
"_bare_list_lit": {
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "open",
"type": "PREC",
"value": 2,
"content": {
"type": "STRING",
"value": "("
"type": "SYMBOL",
"name": "_defun"
}
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "value",
"content": {
"type": "SYMBOL",
"name": "_form"
}
},
{
"type": "SYMBOL",
"name": "_gap"
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "open",
"content": {
"type": "STRING",
"value": "("
}
]
}
},
{
"type": "FIELD",
"name": "close",
"content": {
"type": "STRING",
"value": ")"
}
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "value",
"content": {
"type": "SYMBOL",
"name": "_form"
}
},
{
"type": "SYMBOL",
"name": "_gap"
}
]
}
},
{
"type": "FIELD",
"name": "close",
"content": {
"type": "STRING",
"value": ")"
}
}
]
}
]
},
@ -1698,6 +1711,119 @@
]
}
},
"_defun": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "open",
"content": {
"type": "STRING",
"value": "("
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_gap"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "defun_header"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "value",
"content": {
"type": "SYMBOL",
"name": "_form"
}
},
{
"type": "SYMBOL",
"name": "_gap"
}
]
}
},
{
"type": "FIELD",
"name": "close",
"content": {
"type": "STRING",
"value": ")"
}
}
]
},
"defun_keyword": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "defun"
},
{
"type": "STRING",
"value": "defmacro"
}
]
},
"defun_header": {
"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"
}
}
]
},
"array_dimension": {
"type": "SEQ",
"members": [
@ -1710,6 +1836,23 @@
"value": "A"
}
]
},
"_first_form": {
"type": "CHOICE",
"members": [
{
"type": "PREC",
"value": 2,
"content": {
"type": "SYMBOL",
"name": "defun_header"
}
},
{
"type": "SYMBOL",
"name": "_form"
}
]
}
},
"extras": [

@ -14,6 +14,137 @@
]
}
},
{
"type": "defun_header",
"named": true,
"fields": {
"function_name": {
"multiple": false,
"required": true,
"types": [
{
"type": "char_lit",
"named": true
},
{
"type": "derefing_lit",
"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
}
]
},
"keyword": {
"multiple": false,
"required": true,
"types": [
{
"type": "defun_keyword",
"named": true
}
]
},
"lambda_list": {
"multiple": false,
"required": true,
"types": [
{
"type": "list_lit",
"named": true
}
]
}
},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "comment",
"named": true
},
{
"type": "dis_expr",
"named": true
}
]
}
},
{
"type": "defun_keyword",
"named": true,
"fields": {}
},
{
"type": "derefing_lit",
"named": true,
@ -473,6 +604,10 @@
"type": "comment",
"named": true
},
{
"type": "defun_header",
"named": true
},
{
"type": "dis_expr",
"named": true
@ -1023,6 +1158,10 @@
"type": "comment",
"named": true
},
{
"type": "defun_header",
"named": true
},
{
"type": "dis_expr",
"named": true
@ -1434,6 +1573,10 @@
"type": "comment",
"named": true
},
{
"type": "defun_header",
"named": true
},
{
"type": "dis_expr",
"named": true
@ -2114,6 +2257,14 @@
"type": "comment",
"named": true
},
{
"type": "defmacro",
"named": false
},
{
"type": "defun",
"named": false
},
{
"type": "fancy_literal",
"named": true

File diff suppressed because it is too large Load Diff

@ -51,22 +51,17 @@ Fancy Literal
==========================================
Defun header
==========================================
(defun a (a b)
(car 1 2)
2)
( defun a (a b)
(car 1 2)
2)
---
(source (list_lit (defun_header (sym_lit) (list_lit (sym_lit) (sym_lit))) (list_lit (sym_lit) (num_lit) (num_lit)) (num_lit))
(list_lit (defun_header (sym_lit) (list_lit (sym_lit) (sym_lit))) (list_lit (sym_lit) (num_lit) (num_lit)) (num_lit)))
==========================================
--
(source)
(source
(list_lit (defun (defun_header (defun_keyword) (sym_lit) (list_lit (sym_lit) (sym_lit))) (list_lit (sym_lit) (num_lit) (num_lit)) (num_lit)))
(list_lit (defun (defun_header (defun_keyword) (sym_lit) (list_lit (sym_lit) (sym_lit))) (list_lit (sym_lit) (num_lit) (num_lit)) (num_lit))))
==========================================
Vectors