Как мне скомпилировать древовидные парсеры?

Я пытаюсь скомпилировать парсеры машинописного текста, tsx и python для использования с neovim, но когда я запускаюgcc -o parser.so -shared src/parser.c -Os -I./srcв соответствии с инструкциями по отслеживанию сидящего на дереве я получаю:

Undefined symbols for architecture x86_64:
  "_tree_sitter_tsx_external_scanner_create", referenced from:
      _tree_sitter_tsx.language in parser-eb4e9b.o
  "_tree_sitter_tsx_external_scanner_deserialize", referenced from:
      _tree_sitter_tsx.language in parser-eb4e9b.o
  "_tree_sitter_tsx_external_scanner_destroy", referenced from:
      _tree_sitter_tsx.language in parser-eb4e9b.o
  "_tree_sitter_tsx_external_scanner_scan", referenced from:
      _tree_sitter_tsx.language in parser-eb4e9b.o
  "_tree_sitter_tsx_external_scanner_serialize", referenced from:
      _tree_sitter_tsx.language in parser-eb4e9b.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я выполнил шаги сборки npm и попробовал сделать файл сборки в сборке, но я не могу получить окончательный .so файлы.

2 ответа

Некоторые грамматики имеют внешние сканеры - рукописные исходные файлы на C/C++, которые по соглашению называютсяscanner.c или scanner.cc, которые необходимо скомпилировать вместе с parser.c.

Ошибка undefined symbol: tree_sitter_parsername_external_scanner_createтакже появляется, когда есть несоответствие между именем парсера и именами функций

        // grammar.js
  name: 'parsername',
      // scanner.cc
void *tree_sitter_oldparsername_external_scanner_create() {
  return new Scanner();
}

quickfix: заменить имя в источнике сканера

      sed -i -E 's|(tree_sitter)_oldparsername_|\1_parsername_|g' src/scanner.* 
Другие вопросы по тегам