Как мне скомпилировать древовидные парсеры?
Я пытаюсь скомпилировать парсеры машинописного текста, 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.*