386 строки
8.3 KiB
JavaScript
386 строки
8.3 KiB
JavaScript
const CPP = require("./tree-sitter-cpp/grammar.js")
|
|
|
|
module.exports = grammar(CPP, {
|
|
name: 'cpp',
|
|
|
|
rules: {
|
|
|
|
_top_level_item: ($, original) => choice(
|
|
$.alone_macro,
|
|
$.alone_macro_call,
|
|
original,
|
|
),
|
|
|
|
_field_declaration_list_item: ($, original) => choice(
|
|
original,
|
|
$.macro_statement,
|
|
),
|
|
|
|
alone_macro: $ => /[_A-Z][_A-Z0-9]+\s*\n/,
|
|
alone_macro_call: $ => seq(
|
|
/[_A-Z][_A-Z0-9]+/,
|
|
'(',
|
|
optional(seq(/[_A-Z][_A-Z0-9]+/, repeat(seq(',', /[_A-Z][_A-Z0-9]+/)))),
|
|
')',
|
|
'\n',
|
|
),
|
|
|
|
class_specifier: $ => prec.right(seq(
|
|
'class',
|
|
repeat($.macro_annotation),
|
|
choice(
|
|
field('name', $._class_name),
|
|
seq(
|
|
optional(field('name', $._class_name)),
|
|
optional($.virtual_specifier),
|
|
optional($.base_class_clause),
|
|
field('body', $.field_declaration_list)
|
|
)
|
|
)
|
|
)),
|
|
|
|
struct_specifier: $ => prec.right(seq(
|
|
'struct',
|
|
optional($.macro_annotation),
|
|
choice(
|
|
field('name', $._class_name),
|
|
seq(
|
|
optional(field('name', $._class_name)),
|
|
optional($.virtual_specifier),
|
|
optional($.base_class_clause),
|
|
field('body', $.field_declaration_list)
|
|
)
|
|
)
|
|
)),
|
|
|
|
parameter_list: ($, original) => seq(
|
|
original,
|
|
optional($.macro_annotation),
|
|
),
|
|
|
|
storage_class_specifier: ($, original) => choice(
|
|
original,
|
|
$.macro_annotation,
|
|
),
|
|
|
|
call_expression: ($, original) => choice(
|
|
original,
|
|
$._call_macro_with_decl_first_arg,
|
|
),
|
|
|
|
_call_macro_with_decl_first_arg: $ => seq(
|
|
field('function', choice(
|
|
'CACHE_TRY_INSPECT',
|
|
'CACHE_TRY_UNWRAP',
|
|
'FORWARD',
|
|
'FORWARD_SET_ATTRIBUTE',
|
|
'IDB_TRY_INSPECT',
|
|
'IDB_TRY_UNWRAP',
|
|
'LS_TRY_INSPECT',
|
|
'LS_TRY_UNWRAP',
|
|
'SDB_TRY_INSPECT',
|
|
'SDB_TRY_UNWRAP',
|
|
'PS_GET',
|
|
'PS_GET_AND_SET',
|
|
'PS_GET_LOCKLESS',
|
|
'QM_TRY_INSPECT',
|
|
'QM_NOTEONLY_TRY_UNWRAP',
|
|
'QM_TRY_UNWRAP',
|
|
'QM_WARNONLY_TRY_UNWRAP',
|
|
)),
|
|
field('arguments', seq(
|
|
'(',
|
|
$.parameter_declaration,
|
|
',',
|
|
commaSep(choice($._expression, $.initializer_list)),
|
|
')',
|
|
)),
|
|
),
|
|
|
|
macro_statement: $ => choice(
|
|
'MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER'
|
|
),
|
|
|
|
macro_annotation: $ => choice(
|
|
'MOZ_ALLOCATOR',
|
|
'MOZ_ALLOW_TEMPORARY',
|
|
'MOZ_ALWAYS_INLINE',
|
|
'MOZ_ALWAYS_INLINE_EVEN_DEBUG',
|
|
'MOZ_ASAN_BLACKLIST',
|
|
'MOZ_CAN_RUN_SCRIPT',
|
|
'MOZ_CAN_RUN_SCRIPT_BOUNDARY',
|
|
'MOZ_CAN_RUN_SCRIPT_FOR_DEFINITION',
|
|
'MOZ_COLD',
|
|
'MOZ_FALLTHROUGH',
|
|
'MOZ_FORMAT_PRINTF',
|
|
'MOZ_HAVE_ANALYZER_NORETURN',
|
|
'MOZ_HAVE_ASAN_BLACKLIST',
|
|
'MOZ_HAVE_NEVER_INLINE',
|
|
'MOZ_HAVE_NORETURN',
|
|
'MOZ_HAVE_NORETURN_PTR',
|
|
'MOZ_HAVE_NO_SANITIZE_ATTR',
|
|
'MOZ_HAVE_SIGNED_OVERFLOW_SANITIZE_ATTR',
|
|
'MOZ_HAVE_UNSIGNED_OVERFLOW_SANITIZE_ATTR',
|
|
'MOZ_HEAP_ALLOCATOR',
|
|
'MOZ_HEAP_CLASS',
|
|
'MOZ_IMPLICIT',
|
|
'MOZ_INHERIT_TYPE_ANNOTATIONS_FROM_TEMPLATE_ARGS',
|
|
'MOZ_INIT_OUTSIDE_CTOR',
|
|
'MOZ_IS_CLASS_INIT',
|
|
'MOZ_IS_REFPTR',
|
|
'MOZ_IS_SMARTPTR_TO_REFCOUNTED',
|
|
'MOZ_MAYBE_UNUSED',
|
|
'MOZ_MAY_CALL_AFTER_MUST_RETURN',
|
|
'MOZ_MUST_OVERRIDE',
|
|
'MOZ_MUST_RETURN_FROM_CALLER_IF_THIS_IS_ARG',
|
|
'MOZ_MUST_USE',
|
|
'MOZ_MUST_USE_TYPE',
|
|
'MOZ_NEEDS_MEMMOVABLE_MEMBERS',
|
|
'MOZ_NEEDS_MEMMOVABLE_TYPE',
|
|
'MOZ_NEEDS_NO_VTABLE_TYPE',
|
|
'MOZ_NEVER_INLINE',
|
|
'MOZ_NEVER_INLINE_DEBUG',
|
|
'MOZ_NONHEAP_CLASS',
|
|
'MOZ_NONNULL',
|
|
'MOZ_NONNULL_RETURN',
|
|
'MOZ_NON_AUTOABLE',
|
|
'MOZ_NON_MEMMOVABLE',
|
|
'MOZ_NON_OWNING_REF',
|
|
'MOZ_NON_PARAM',
|
|
'MOZ_NON_TEMPORARY_CLASS',
|
|
'MOZ_NORETURN',
|
|
'MOZ_NORETURN_PTR',
|
|
'MOZ_NO_ADDREF_RELEASE_ON_RETURN',
|
|
'MOZ_NO_ARITHMETIC_EXPR_IN_ARGUMENT',
|
|
'MOZ_NO_DANGLING_ON_TEMPORARIES',
|
|
'MOZ_NO_SANITIZE_SIGNED_OVERFLOW',
|
|
'MOZ_NO_SANITIZE_UNSIGNED_OVERFLOW',
|
|
'MOZ_ONLY_USED_TO_AVOID_STATIC_CONSTRUCTORS',
|
|
'MOZ_OWNING_REF',
|
|
'MOZ_POP_DISABLE_NONTRIVIAL_UNION_WARNINGS',
|
|
'MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS',
|
|
'MOZ_PUSH_DISABLE_NONTRIVIAL_UNION_WARNINGS',
|
|
'MOZ_RAII',
|
|
'MOZ_REQUIRED_BASE_METHOD',
|
|
'MOZ_STACK_CLASS',
|
|
'MOZ_STATIC_CLASS',
|
|
'MOZ_STATIC_LOCAL_CLASS',
|
|
'MOZ_TEMPORARY_CLASS',
|
|
'MOZ_TRIVIAL_CTOR_DTOR',
|
|
'MOZ_TSAN_BLACKLIST',
|
|
'MOZ_UNSAFE_REF',
|
|
'MOZ_XPCOM_ABI',
|
|
'JS_PUBLIC_API',
|
|
),
|
|
|
|
primitive_type: $ => token(choice(
|
|
'APIENTRY',
|
|
'ATOM',
|
|
'BOOL',
|
|
'BOOLEAN',
|
|
'BYTE',
|
|
'CCHAR',
|
|
'CHAR',
|
|
'COLORREF',
|
|
'DWORD',
|
|
'DWORDLONG',
|
|
'DWORD_PTR',
|
|
'DWORD32',
|
|
'DWORD64',
|
|
'FLOAT',
|
|
'HACCEL',
|
|
'HALF_PTR',
|
|
'HANDLE',
|
|
'HBITMAP',
|
|
'HBRUSH',
|
|
'HCOLORSPACE',
|
|
'HCONV',
|
|
'HCONVLIST',
|
|
'HCURSOR',
|
|
'HDC',
|
|
'HDDEDATA',
|
|
'HDESK',
|
|
'HDROP',
|
|
'HDWP',
|
|
'HENHMETAFILE',
|
|
'HFILE',
|
|
'HFONT',
|
|
'HGDIOBJ',
|
|
'HGLOBAL',
|
|
'HHOOK',
|
|
'HICON',
|
|
'HINSTANCE',
|
|
'HKEY',
|
|
'HKL',
|
|
'HLOCAL',
|
|
'HMENU',
|
|
'HMETAFILE',
|
|
'HMODULE',
|
|
'HMONITOR',
|
|
'HPALETTE',
|
|
'HPEN',
|
|
'HRESULT',
|
|
'HRGN',
|
|
'HRSRC',
|
|
'HSZ',
|
|
'HWINSTA',
|
|
'HWND',
|
|
'INT',
|
|
'INT_PTR',
|
|
'INT8',
|
|
'INT16',
|
|
'INT32',
|
|
'INT64',
|
|
'LANGID',
|
|
'LCID',
|
|
'LCTYPE',
|
|
'LGRPID',
|
|
'LONG',
|
|
'LONGLONG',
|
|
'LONG_PTR',
|
|
'LONG32',
|
|
'LONG64',
|
|
'LPARAM',
|
|
'LPBOOL',
|
|
'LPBYTE',
|
|
'LPCOLORREF',
|
|
'LPCSTR',
|
|
'LPCVOID',
|
|
'LPCWSTR',
|
|
'LPDWORD',
|
|
'LPHANDLE',
|
|
'LPINT',
|
|
'LPLONG',
|
|
'LPSTR',
|
|
'LPTSTR',
|
|
'LPWOID',
|
|
'LPWORD',
|
|
'LPWSTR',
|
|
'LRESULT',
|
|
'PBOOL',
|
|
'PBOOLEAN',
|
|
'PBYTE',
|
|
'PCHAR',
|
|
'PCSTR',
|
|
'PCTSTR',
|
|
'PCWSTR',
|
|
'PDWORD',
|
|
'PDWORDLONG',
|
|
'PDWORD_PTR',
|
|
'PDWORD32',
|
|
'PDWORD64',
|
|
'PFLOAT',
|
|
'PHALF_PTR',
|
|
'PHANDLE',
|
|
'PHKEY',
|
|
'PINT',
|
|
'PINT_PTR',
|
|
'PINT8',
|
|
'PINT16',
|
|
'PINT32',
|
|
'PINT64',
|
|
'PLCID',
|
|
'PLONG',
|
|
'PLONGLONG',
|
|
'PLONG32',
|
|
'PLONG64',
|
|
'POINTER_32',
|
|
'POINTER_64',
|
|
'POINTER_SIGNED',
|
|
'POINTER_UNSIGNED',
|
|
'PSHORT',
|
|
'PSIZE_T',
|
|
'PSSIZE_T',
|
|
'PSTR',
|
|
'PTBYTE',
|
|
'PTCHAR',
|
|
'PTSTR',
|
|
'PUCHAR',
|
|
'PUHALF_PTR',
|
|
'PUINT',
|
|
'PUINT_PTR',
|
|
'PUINT8',
|
|
'PUINT16',
|
|
'PUINT32',
|
|
'PUINT64',
|
|
'PULONG',
|
|
'PULONGLONG',
|
|
'PULONG32',
|
|
'PULONG64',
|
|
'PUSHORT',
|
|
'PVOID',
|
|
'PWCHAR',
|
|
'PWORD',
|
|
'PWSTR',
|
|
'QWORD',
|
|
'SC_HANDLE',
|
|
'SC_LOCK',
|
|
'SERVICE_STATUS_HANDLE',
|
|
'SHORT',
|
|
'SIZE_T',
|
|
'SSIZE_T',
|
|
'TBYTE',
|
|
'TCHAR',
|
|
'UCHAR',
|
|
'UHALF_PTR',
|
|
'UINT',
|
|
'UINT_PTR',
|
|
'UINT8',
|
|
'UINT16',
|
|
'UINT32',
|
|
'UINT64',
|
|
'ULONG',
|
|
'ULONGLONG',
|
|
'ULONG_PTR',
|
|
'ULONG32',
|
|
'ULONG64',
|
|
'UNICODE_STRING',
|
|
'USHORT',
|
|
'USN',
|
|
'VOID',
|
|
'WCHAR',
|
|
'WORD',
|
|
'WPARAM',
|
|
'bool',
|
|
'char',
|
|
'int',
|
|
'float',
|
|
'double',
|
|
'void',
|
|
'size_t',
|
|
'ssize_t',
|
|
'intptr_t',
|
|
'uintptr_t',
|
|
'charptr_t',
|
|
'intmax_t',
|
|
'intptr_t',
|
|
'uintmax_t',
|
|
'uintptr_t',
|
|
'ptrdiff_t',
|
|
'max_align_t',
|
|
'wchar_t',
|
|
'sig_atomic_t',
|
|
...[8, 16, 32, 64].map(n => `int${n}_t`),
|
|
...[8, 16, 32, 64].map(n => `uint${n}_t`),
|
|
...[8, 16, 32, 64].map(n => `char${n}_t`),
|
|
...[8, 16, 32, 64].map(n => `int_fast${n}_t`),
|
|
...[8, 16, 32, 64].map(n => `int_least${n}_t`),
|
|
...[8, 16, 32, 64].map(n => `uint_fast${n}_t`),
|
|
...[8, 16, 32, 64].map(n => `uint_least${n}_t`),
|
|
)),
|
|
|
|
concatenated_string: $ => seq(
|
|
choice($.raw_string_literal, $.string_literal),
|
|
repeat1(choice($.raw_string_literal, $.string_literal, $.identifier))
|
|
),
|
|
}
|
|
});
|
|
|
|
function commaSep(rule) {
|
|
return optional(commaSep1(rule));
|
|
}
|
|
|
|
function commaSep1(rule) {
|
|
return seq(rule, repeat(seq(',', rule)));
|
|
}
|