|
|
|
@ -58,21 +58,24 @@ const HEX_DIGIT =
|
|
|
|
const OCTAL_DIGIT =
|
|
|
|
const OCTAL_DIGIT =
|
|
|
|
/[0-7]/;
|
|
|
|
/[0-7]/;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const BINARY_DIGIT =
|
|
|
|
|
|
|
|
/[0-1]/;
|
|
|
|
|
|
|
|
|
|
|
|
const HEX_NUMBER =
|
|
|
|
const HEX_NUMBER =
|
|
|
|
seq("0",
|
|
|
|
seq(choice('#x', '#X'), optional(/[+-]/),
|
|
|
|
/[xX]/,
|
|
|
|
repeat1(HEX_DIGIT));
|
|
|
|
repeat1(HEX_DIGIT),
|
|
|
|
|
|
|
|
optional("N"));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const OCTAL_NUMBER =
|
|
|
|
const OCTAL_NUMBER =
|
|
|
|
seq("0",
|
|
|
|
seq(choice('#o', '#O'), optional(/[+-]/),
|
|
|
|
repeat1(OCTAL_DIGIT),
|
|
|
|
repeat1(OCTAL_DIGIT));
|
|
|
|
optional("N"));
|
|
|
|
|
|
|
|
|
|
|
|
const BINARY_NUMBER =
|
|
|
|
|
|
|
|
seq(choice('#b', '#B'), optional(/[+-]/),
|
|
|
|
|
|
|
|
repeat1(BINARY_DIGIT));
|
|
|
|
|
|
|
|
|
|
|
|
// XXX: not constraining number before r/R
|
|
|
|
|
|
|
|
// XXX: not constraining portion after r/R
|
|
|
|
|
|
|
|
const RADIX_NUMBER =
|
|
|
|
const RADIX_NUMBER =
|
|
|
|
seq(repeat1(DIGIT),
|
|
|
|
seq('#',
|
|
|
|
|
|
|
|
repeat1(DIGIT),
|
|
|
|
/[rR]/,
|
|
|
|
/[rR]/,
|
|
|
|
repeat1(ALPHANUMERIC));
|
|
|
|
repeat1(ALPHANUMERIC));
|
|
|
|
|
|
|
|
|
|
|
|
@ -96,13 +99,15 @@ const INTEGER =
|
|
|
|
optional(/[MN]/));
|
|
|
|
optional(/[MN]/));
|
|
|
|
|
|
|
|
|
|
|
|
const NUMBER =
|
|
|
|
const NUMBER =
|
|
|
|
token(prec(0, seq(optional(/[+-]/),
|
|
|
|
token(seq(optional(/[+-]/),
|
|
|
|
choice(HEX_NUMBER,
|
|
|
|
choice(
|
|
|
|
//OCTAL_NUMBER,
|
|
|
|
HEX_NUMBER,
|
|
|
|
|
|
|
|
OCTAL_NUMBER,
|
|
|
|
RADIX_NUMBER,
|
|
|
|
RADIX_NUMBER,
|
|
|
|
|
|
|
|
BINARY_NUMBER,
|
|
|
|
RATIO,
|
|
|
|
RATIO,
|
|
|
|
DOUBLE,
|
|
|
|
DOUBLE,
|
|
|
|
INTEGER))));
|
|
|
|
INTEGER)));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function clSymbol(symbol) {
|
|
|
|
function clSymbol(symbol) {
|
|
|
|
@ -273,8 +278,8 @@ module.exports = grammar(clojure, {
|
|
|
|
seq('#', choice(original, /\\[nN]ewline/, /\\[lL]inefeed/, /\\[Ss]pace/, /\\[nN]ull/, /\\[rR]ull/)),
|
|
|
|
seq('#', choice(original, /\\[nN]ewline/, /\\[lL]inefeed/, /\\[Ss]pace/, /\\[nN]ull/, /\\[rR]ull/)),
|
|
|
|
|
|
|
|
|
|
|
|
vec_lit: $ =>
|
|
|
|
vec_lit: $ =>
|
|
|
|
prec(PREC.SPECIAL,
|
|
|
|
prec(PREC.SPECIAL,
|
|
|
|
choice(
|
|
|
|
choice(
|
|
|
|
seq(field('open', choice('#0A', '#0a')), $.num_lit),
|
|
|
|
seq(field('open', choice('#0A', '#0a')), $.num_lit),
|
|
|
|
seq(field('open', '#'), optional($.array_dimension), $.list_lit))),
|
|
|
|
seq(field('open', '#'), optional($.array_dimension), $.list_lit))),
|
|
|
|
|
|
|
|
|
|
|
|
@ -315,6 +320,8 @@ module.exports = grammar(clojure, {
|
|
|
|
kwd_symbol: _ =>
|
|
|
|
kwd_symbol: _ =>
|
|
|
|
seq(SYMBOL),
|
|
|
|
seq(SYMBOL),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self_referential_reader_macro: _ => /#\d+[=#]/,
|
|
|
|
|
|
|
|
|
|
|
|
_form: $ =>
|
|
|
|
_form: $ =>
|
|
|
|
seq(optional('#'),
|
|
|
|
seq(optional('#'),
|
|
|
|
choice(
|
|
|
|
choice(
|
|
|
|
@ -322,9 +329,10 @@ module.exports = grammar(clojure, {
|
|
|
|
$.fancy_literal,
|
|
|
|
$.fancy_literal,
|
|
|
|
$.vec_lit,
|
|
|
|
$.vec_lit,
|
|
|
|
$.kwd_lit,
|
|
|
|
$.kwd_lit,
|
|
|
|
// No idea why this is necessary...
|
|
|
|
// No idea why this is necessary...It is never used but triggers some background magic
|
|
|
|
alias(seq(field('open', '#'), optional(/\d+[aA]/), $.list_lit), $.vec_lit),
|
|
|
|
alias(seq(field('open', '#'), optional(/\d+[aA]/), $.list_lit), $.vec_lit),
|
|
|
|
$.str_lit,
|
|
|
|
$.str_lit,
|
|
|
|
|
|
|
|
$.self_referential_reader_macro,
|
|
|
|
$.char_lit,
|
|
|
|
$.char_lit,
|
|
|
|
$.nil_lit,
|
|
|
|
$.nil_lit,
|
|
|
|
$.path_lit,
|
|
|
|
$.path_lit,
|
|
|
|
|