difftastic/grammar.js

60 lines
1.5 KiB
JavaScript

const COMMENT = token(/;.*\n?/);
const STRING = token(
seq('"', repeat(/[^"\\]/), repeat(seq("\\", /./, repeat(/[^"\\]/))), '"')
);
const SYMBOL = token(/&?[a-zA-Z0-9_?:/*+=<>-]+/);
const INTEGER_BASE10 = token(/[+-]?[0-9]+\.?/);
const INTEGER_WITH_BASE = token(/#([box]|[0-9][0-9]?r)[0-9a-zA-Z]/);
const FLOAT_WITH_DEC_POINT = token(/[+-]?[0-9]*\.[0-9]+/);
const FLOAT_WITH_EXPONENT = token(/[+-]?[0-9]+[eE][0-9]+/);
const FLOAT_WITH_BOTH = token(/[+-]?[0-9]*\.[0-9]+[eE][0-9]+/);
const FLOAT_INF = token(/-?1.0[eE]\+INF/);
const FLOAT_NAN = token(/-?0.0[eE]\+NaN/);
const CHAR = token(/\?(\\.|.)/);
module.exports = grammar({
name: "elisp",
extras: ($) => [/\s/, $.comment],
rules: {
source_file: ($) => repeat($._sexp),
_sexp: ($) => choice($.list, $.vector, $._atom, $.quote, $.unquote),
quote: ($) => seq(choice("#'", "'", "`"), $._sexp),
unquote: ($) => seq(choice(",@", ","), $._sexp),
_atom: ($) => choice($.float, $.integer, $.char, $.string, $.symbol),
float: ($) =>
choice(
FLOAT_WITH_DEC_POINT,
FLOAT_WITH_EXPONENT,
FLOAT_WITH_BOTH,
FLOAT_INF,
FLOAT_NAN
),
integer: ($) => choice(INTEGER_BASE10, INTEGER_WITH_BASE),
char: ($) => CHAR,
string: ($) => STRING,
symbol: ($) => SYMBOL,
// dotted_list: ($) =>
// seq(
// "(",
// $._sexp,
// ".",
// $._sexp,
// ")"
// ),
list: ($) => seq("(", repeat($._sexp), ")"),
vector: ($) => seq("[", repeat($._sexp), "]"),
comment: ($) => COMMENT,
},
});