Fix repeat clause and allow # before char_lit

pull/70/head
Stephan Seitz 2021-04-15 21:10:13 +07:00
parent 14913f6702
commit f328310b1e
5 changed files with 78552 additions and 82772 deletions

@ -23,7 +23,7 @@ const PREC = {
} }
const SYMBOL_HEAD = 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]/; /[^:.\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 = const SYMBOL_BODY =
choice(SYMBOL_HEAD, choice(SYMBOL_HEAD,
@ -97,7 +97,7 @@ module.exports = grammar(clojure, {
with_clause: $ => prec.left(seq('with', optional($._gap), $._form, optional($._gap), "=", optional($._gap), $._form)), with_clause: $ => prec.left(seq('with', optional($._gap), $._form, optional($._gap), "=", optional($._gap), $._form)),
do_clause: $ => prec.left(seq('do', repeat1(prec.left(seq(repeat($._gap), $._form, repeat($._gap)))))), do_clause: $ => prec.left(seq('do', repeat1(prec.left(seq(repeat($._gap), $._form, repeat($._gap)))))),
while_clause: $ => prec.left(seq('while', optional($._gap), $._form)), while_clause: $ => prec.left(seq(choice('while', 'until'), optional($._gap), $._form)),
repeat_clause: $ => prec.left(seq('repeat', 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)), 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))), accumulation_clause: $ => seq($.accumulation_verb, optional($._gap), $._form, optional(seq(optional($._gap), 'into', optional($._gap), $._form))),
@ -110,6 +110,7 @@ module.exports = grammar(clojure, {
$.do_clause, $.do_clause,
$.list_lit, $.list_lit,
$.while_clause, $.while_clause,
$.repeat_clause,
$.accumulation_clause, $.accumulation_clause,
$.condition_clause, $.condition_clause,
$.with_clause, $.with_clause,
@ -131,7 +132,7 @@ module.exports = grammar(clojure, {
seq(field('keyword', $.defun_keyword), seq(field('keyword', $.defun_keyword),
repeat($._gap), repeat($._gap),
field('function_name', $._form), field('function_name', $._form),
optional(field('specifier', seq(repeat($._gap),$.kwd_lit))), optional(field('specifier', seq(repeat($._gap), $.kwd_lit))),
repeat($._gap), repeat($._gap),
field('lambda_list', $.list_lit)), field('lambda_list', $.list_lit)),
seq(field('keyword', alias('lambda', $.defun_keyword)), seq(field('keyword', alias('lambda', $.defun_keyword)),
@ -139,10 +140,13 @@ module.exports = grammar(clojure, {
field('lambda_list', $.list_lit)) field('lambda_list', $.list_lit))
), ),
array_dimension: $ => seq($.num_lit, 'A'), array_dimension: $ => seq($.num_lit, choice('A', 'a')),
char_lit: (_, original) =>
seq(optional('#'), original),
_bare_vec_lit: $ => _bare_vec_lit: $ =>
choice(seq(field('open', '#0A'), $.num_lit), choice(seq(field('open', choice('#0A', '#0a')), $.num_lit),
seq(field('open', '#'), optional(field('dimension_indicator', $.array_dimension)), $.list_lit)), seq(field('open', '#'), optional(field('dimension_indicator', $.array_dimension)), $.list_lit)),
_bare_list_lit: $ => _bare_list_lit: $ =>
@ -218,7 +222,7 @@ module.exports = grammar(clojure, {
complex_num_lit: $ => complex_num_lit: $ =>
seq(repeat($._metadata_lit), seq(repeat($._metadata_lit),
field('marker', "#C"), field('marker', choice("#C", "#c")),
repeat($._gap), repeat($._gap),
'(', '(',
repeat($._gap), repeat($._gap),

@ -526,132 +526,149 @@
} }
}, },
"char_lit": { "char_lit": {
"type": "TOKEN", "type": "SEQ",
"content": { "members": [
"type": "SEQ", {
"members": [ "type": "CHOICE",
{ "members": [
"type": "STRING", {
"value": "\\" "type": "STRING",
}, "value": "#"
{ },
"type": "CHOICE", {
"type": "BLANK"
}
]
},
{
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [ "members": [
{ {
"type": "SEQ", "type": "STRING",
"value": "\\"
},
{
"type": "CHOICE",
"members": [ "members": [
{ {
"type": "STRING", "type": "SEQ",
"value": "o"
},
{
"type": "CHOICE",
"members": [ "members": [
{ {
"type": "SEQ", "type": "STRING",
"value": "o"
},
{
"type": "CHOICE",
"members": [ "members": [
{ {
"type": "PATTERN", "type": "SEQ",
"value": "[0-9]" "members": [
{
"type": "PATTERN",
"value": "[0-9]"
},
{
"type": "PATTERN",
"value": "[0-9]"
},
{
"type": "PATTERN",
"value": "[0-9]"
}
]
}, },
{ {
"type": "PATTERN", "type": "SEQ",
"value": "[0-9]" "members": [
{
"type": "PATTERN",
"value": "[0-9]"
},
{
"type": "PATTERN",
"value": "[0-9]"
}
]
}, },
{ {
"type": "PATTERN", "type": "SEQ",
"value": "[0-9]" "members": [
{
"type": "PATTERN",
"value": "[0-9]"
}
]
} }
] ]
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "backspace"
}, },
{ {
"type": "SEQ", "type": "STRING",
"members": [ "value": "formfeed"
{
"type": "PATTERN",
"value": "[0-9]"
},
{
"type": "PATTERN",
"value": "[0-9]"
}
]
}, },
{ {
"type": "SEQ", "type": "STRING",
"members": [ "value": "newline"
{ },
"type": "PATTERN", {
"value": "[0-9]" "type": "STRING",
} "value": "return"
] },
{
"type": "STRING",
"value": "space"
},
{
"type": "STRING",
"value": "tab"
} }
] ]
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "backspace"
},
{
"type": "STRING",
"value": "formfeed"
},
{
"type": "STRING",
"value": "newline"
},
{
"type": "STRING",
"value": "return"
}, },
{ {
"type": "STRING", "type": "SEQ",
"value": "space" "members": [
}, {
{ "type": "STRING",
"type": "STRING", "value": "u"
"value": "tab" },
} {
] "type": "PATTERN",
}, "value": "[0-9a-fA-F]"
{ },
"type": "SEQ", {
"members": [ "type": "PATTERN",
{ "value": "[0-9a-fA-F]"
"type": "STRING", },
"value": "u" {
}, "type": "PATTERN",
{ "value": "[0-9a-fA-F]"
"type": "PATTERN", },
"value": "[0-9a-fA-F]" {
}, "type": "PATTERN",
{ "value": "[0-9a-fA-F]"
"type": "PATTERN", }
"value": "[0-9a-fA-F]" ]
},
{
"type": "PATTERN",
"value": "[0-9a-fA-F]"
}, },
{ {
"type": "PATTERN", "type": "PATTERN",
"value": "[0-9a-fA-F]" "value": ".|\\n"
} }
] ]
},
{
"type": "PATTERN",
"value": ".|\\n"
} }
] ]
} }
] }
} ]
}, },
"nil_lit": { "nil_lit": {
"type": "TOKEN", "type": "TOKEN",
@ -693,7 +710,7 @@
"members": [ "members": [
{ {
"type": "PATTERN", "type": "PATTERN",
"value": "[^:.\\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]" "value": "[^:.\\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]"
}, },
{ {
"type": "REPEAT", "type": "REPEAT",
@ -702,7 +719,7 @@
"members": [ "members": [
{ {
"type": "PATTERN", "type": "PATTERN",
"value": "[^:.\\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]" "value": "[^:.\\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]"
}, },
{ {
"type": "PATTERN", "type": "PATTERN",
@ -1016,8 +1033,17 @@
"type": "FIELD", "type": "FIELD",
"name": "open", "name": "open",
"content": { "content": {
"type": "STRING", "type": "CHOICE",
"value": "#0A" "members": [
{
"type": "STRING",
"value": "#0A"
},
{
"type": "STRING",
"value": "#0a"
}
]
} }
}, },
{ {
@ -2026,8 +2052,17 @@
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
{ {
"type": "STRING", "type": "CHOICE",
"value": "while" "members": [
{
"type": "STRING",
"value": "while"
},
{
"type": "STRING",
"value": "until"
}
]
}, },
{ {
"type": "CHOICE", "type": "CHOICE",
@ -2265,6 +2300,10 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "while_clause" "name": "while_clause"
}, },
{
"type": "SYMBOL",
"name": "repeat_clause"
},
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "accumulation_clause" "name": "accumulation_clause"
@ -2489,8 +2528,17 @@
"name": "num_lit" "name": "num_lit"
}, },
{ {
"type": "STRING", "type": "CHOICE",
"value": "A" "members": [
{
"type": "STRING",
"value": "A"
},
{
"type": "STRING",
"value": "a"
}
]
} }
] ]
}, },
@ -2652,8 +2700,17 @@
"type": "FIELD", "type": "FIELD",
"name": "marker", "name": "marker",
"content": { "content": {
"type": "STRING", "type": "CHOICE",
"value": "#C" "members": [
{
"type": "STRING",
"value": "#C"
},
{
"type": "STRING",
"value": "#c"
}
]
} }
}, },
{ {

@ -134,6 +134,11 @@
"named": true, "named": true,
"fields": {} "fields": {}
}, },
{
"type": "char_lit",
"named": true,
"fields": {}
},
{ {
"type": "complex_num_lit", "type": "complex_num_lit",
"named": true, "named": true,
@ -155,6 +160,10 @@
{ {
"type": "#C", "type": "#C",
"named": false "named": false
},
{
"type": "#c",
"named": false
} }
] ]
}, },
@ -1866,6 +1875,10 @@
"type": "list_lit", "type": "list_lit",
"named": true "named": true
}, },
{
"type": "repeat_clause",
"named": true
},
{ {
"type": "termination_clause", "type": "termination_clause",
"named": true "named": true
@ -2589,6 +2602,117 @@
] ]
} }
}, },
{
"type": "repeat_clause",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "char_lit",
"named": true
},
{
"type": "comment",
"named": true
},
{
"type": "complex_num_lit",
"named": true
},
{
"type": "derefing_lit",
"named": true
},
{
"type": "dis_expr",
"named": true
},
{
"type": "evaling_lit",
"named": true
},
{
"type": "fancy_literal",
"named": true
},
{
"type": "include_reader_macro",
"named": true
},
{
"type": "kwd_lit",
"named": true
},
{
"type": "list_lit",
"named": true
},
{
"type": "nil_lit",
"named": true
},
{
"type": "num_lit",
"named": true
},
{
"type": "package_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": "set_lit", "type": "set_lit",
"named": true, "named": true,
@ -3809,6 +3933,10 @@
{ {
"type": "#0A", "type": "#0A",
"named": false "named": false
},
{
"type": "#0a",
"named": false
} }
] ]
} }
@ -4082,6 +4210,10 @@
"type": "#0A", "type": "#0A",
"named": false "named": false
}, },
{
"type": "#0a",
"named": false
},
{ {
"type": "#=", "type": "#=",
"named": false "named": false
@ -4106,6 +4238,10 @@
"type": "#_", "type": "#_",
"named": false "named": false
}, },
{
"type": "#c",
"named": false
},
{ {
"type": "'", "type": "'",
"named": false "named": false
@ -4158,6 +4294,10 @@
"type": "`", "type": "`",
"named": false "named": false
}, },
{
"type": "a",
"named": false
},
{ {
"type": "accumulation_verb", "type": "accumulation_verb",
"named": true "named": true
@ -4194,10 +4334,6 @@
"type": "by", "type": "by",
"named": false "named": false
}, },
{
"type": "char_lit",
"named": true
},
{ {
"type": "cl:loop", "type": "cl:loop",
"named": false "named": false
@ -4310,6 +4446,10 @@
"type": "unless", "type": "unless",
"named": false "named": false
}, },
{
"type": "until",
"named": false
},
{ {
"type": "upto", "type": "upto",
"named": false "named": false

File diff suppressed because it is too large Load Diff

@ -577,3 +577,42 @@ Functions with numbers (TODO!!!)
(sym_lit) (sym_lit)
(num_lit) (num_lit)
(sym_lit)) (sym_lit))
================================================================================
Petalisp shapes
================================================================================
(~ (* w h) ~ 128)
--------------------------------------------------------------------------------
(source
(list_lit
(sym_lit)
(list_lit
(sym_lit)
(sym_lit)
(sym_lit))
(sym_lit)
(num_lit)))
================================================================================
Chars
================================================================================
#\?
--------------------------------------------------------------------------------
(source
(char_lit))
================================================================================
Dotted literals
================================================================================
foo.bar
foo. bar
.bar
#.bar
--------------------------------------------------------------------------------