Add precedence to loop_macro, defun again

pull/70/head
Stephan Seitz 2021-04-19 14:03:14 +07:00
parent 2c9a20d4ee
commit accd544cec
5 changed files with 83452 additions and 82291 deletions

@ -39,12 +39,12 @@ const SYMBOL =
repeat(SYMBOL_BODY)));
const STRING =
token(seq('"',
repeat(/[^"\\]/),
repeat(seq("\\",
/./,
repeat(/[^"\\]/))),
'"'));
token(seq('"',
repeat(/[^"\\]/),
repeat(seq("\\",
/./,
repeat(/[^"\\]/))),
'"'));
function clSymbol(symbol) {
@ -83,11 +83,11 @@ module.exports = grammar(clojure, {
field('value', ($._form))),
defun: $ =>
seq(field('open', "("),
prec(PREC.SPECIAL, seq(field('open', "("),
optional($._gap),
$.defun_header,
repeat(choice(field('value', $._form), $._gap)),
field('close', ")")),
field('close', ")"))),
_format_token: $ => choice($.num_lit, seq("'", alias(/./, $.char_lit))),
// https://en.wikipedia.org/wiki/Format_Common_Lisp)
@ -186,11 +186,12 @@ module.exports = grammar(clojure, {
)),
loop_macro: $ =>
seq(field('open', "("),
optional($._gap),
clSymbol('loop'),
repeat(choice($.loop_clause, $._gap)),
field('close', ")")),
prec(PREC.SPECIAL,
seq(field('open', "("),
optional($._gap),
clSymbol('loop'),
repeat(choice($.loop_clause, $._gap)),
field('close', ")"))),
defun_keyword: _ => clSymbol(choice('defun', 'defmacro', 'defgeneric', 'defmethod')),
@ -222,7 +223,7 @@ module.exports = grammar(clojure, {
path_lit: $ =>
prec(PREC.SPECIAL,
seq(field('open', choice('#P','#p')), alias(STRING, $.str_lit))),
seq(field('open', choice('#P', '#p')), alias(STRING, $.str_lit))),
_bare_list_lit: $ =>
choice(prec(PREC.SPECIAL, $.defun),
@ -232,13 +233,13 @@ module.exports = grammar(clojure, {
field('close', ")"))),
package_lit: $ => prec(PREC.PACKAGE_LIT, seq(
field('package', $.sym_lit), // Make optional, instead of keywords?
field('package', choice($.sym_lit, 'cl')), // Make optional, instead of keywords?
choice(':', '::'),
field('symbol', $.sym_lit)
)),
_package_lit_without_slash: $ => seq(
field('package', $._sym_lit_without_slash), // Make optional, instead of keywords?
field('package', choice($._sym_lit_without_slash, 'cl')), // Make optional, instead of keywords?
choice(':', '::'),
field('symbol', $._sym_lit_without_slash)
),

@ -1740,61 +1740,65 @@
}
},
"defun": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "open",
"content": {
"type": "STRING",
"value": "("
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_gap"
},
{
"type": "BLANK"
"type": "PREC",
"value": 5,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "open",
"content": {
"type": "STRING",
"value": "("
}
]
},
{
"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": "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": ")"
}
}
},
{
"type": "FIELD",
"name": "close",
"content": {
"type": "STRING",
"value": ")"
}
}
]
]
}
},
"_format_token": {
"type": "CHOICE",
@ -3237,83 +3241,87 @@
]
},
"loop_macro": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "open",
"content": {
"type": "STRING",
"value": "("
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_gap"
},
{
"type": "BLANK"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "cl"
},
{
"type": "STRING",
"value": ":"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "PREC",
"value": 5,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "open",
"content": {
"type": "STRING",
"value": "loop"
"value": "("
}
]
},
{
"type": "REPEAT",
"content": {
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "loop_clause"
"name": "_gap"
},
{
"type": "SYMBOL",
"name": "_gap"
"type": "BLANK"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "cl"
},
{
"type": "STRING",
"value": ":"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "loop"
}
]
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "loop_clause"
},
{
"type": "SYMBOL",
"name": "_gap"
}
]
}
},
{
"type": "FIELD",
"name": "close",
"content": {
"type": "STRING",
"value": ")"
}
}
},
{
"type": "FIELD",
"name": "close",
"content": {
"type": "STRING",
"value": ")"
}
}
]
]
}
},
"defun_keyword": {
"type": "SEQ",
@ -3607,8 +3615,17 @@
"type": "FIELD",
"name": "package",
"content": {
"type": "SYMBOL",
"name": "sym_lit"
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "sym_lit"
},
{
"type": "STRING",
"value": "cl"
}
]
}
},
{
@ -3642,8 +3659,17 @@
"type": "FIELD",
"name": "package",
"content": {
"type": "SYMBOL",
"name": "_sym_lit_without_slash"
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_sym_lit_without_slash"
},
{
"type": "STRING",
"value": "cl"
}
]
}
},
{

@ -2477,6 +2477,10 @@
"multiple": false,
"required": true,
"types": [
{
"type": "cl",
"named": false
},
{
"type": "sym_lit",
"named": true

File diff suppressed because it is too large Load Diff

@ -918,3 +918,23 @@ Path Literals
(str_lit))
(path_lit
(str_lit)))
================================================================================
Weird error
================================================================================
(in-package :common-lisp-user)
(cl:in-package #:common-lisp-user)
--------------------------------------------------------------------------------
(source
(list_lit
(sym_lit)
(kwd_lit
(kwd_symbol)))
(list_lit
(package_lit
(sym_lit))
(kwd_lit
(kwd_symbol))))