tree-sitter-ccomment/grammar.js (45 lines of code) (raw):
module.exports = grammar({
name: 'ccomment',
externals: $ => [
$.raw_string_literal,
],
rules: {
translation_unit: $ => repeat($._top_level_item),
_top_level_item: $ => choice(
$.string_literal,
$.char_literal,
$.raw_string_literal,
$.comment,
$.nothing,
$.define,
),
nothing: $ => token(
choice(
/[^R"'\/#]+/,
'R',
'#',
)
),
preproc_continuation_line: $ => token(
///([^\\\n]|\\[^\n])*\\\r*\n/
/.*\\\r?\n/
),
preproc_line: $ => token(
///[^\n]*\n/
/.*\n/
),
define: $ => seq(
/#[ \t]*define[ \t]+/,
repeat($.preproc_continuation_line),
$.preproc_line,
),
string_literal: $ => seq(
/"([^\\"]|\\(.|\n))*"/,
),
char_literal: $ => seq(
/'([^\\']|\\(.|\n))*'/,
),
// http://stackoverflow.com/questions/13014947/regex-to-match-a-c-style-multiline-comment/36328890#36328890
comment: $ => token(choice(
seq('//', /(\\(.|\r?\n)|[^\\\n])*/),
seq(
'/*',
/[^*]*\*+([^/*][^*]*\*+)*/,
'/'
)
)),
},
});