Я пишу свой собственный редактор c/c++, и теперь, когда я делаю все, что я хочу добавить авто предложения, когда я пишу, для этого мне нужно разобрать заголовок, который включен в мой текущий файл, и организовать их в структуру JSON, я ищу дизайн, который дает мне лучшую производительность, но я едва ли имею опыт в этой области, так вот как я начал его, предположим, что у меня была эта простая c-программа
#include<stdio.h>
#include<stdlib.h>
#include<sys/scoket.h>
int main()
{
return 0;
}
У меня есть класс под названием document и у него есть 3 массива:
содержит все имена каждого включенного заголовка, изменения его содержимого основаны на моих инструкциях inculde, поэтому для вышеуказанного документа его содержимое
"stdio" "stdlib" "scoket"
как я уже сказал, у меня нет опыта, и я не читал о том, как они это делают, но, кроме части JSON, это то, как они добавляют автоматическое предложение к среде IDE?
также я был бы признателен за некоторые подсказки, которые могли бы помочь мне улучшить этот дизайн или даже отказаться от него.
ps: если кто-то задается вопросом, почему JSON его, потому что я собираюсь сделать его онлайн-версию!
Шаг 1. A) Напишите совместимый C-парсер, способный перемещаться по лабиринту операторов препроцессора CPP (не C++, CPP).
ИЛИ
Шаг 1. B) Закрепите существующий, соответствующий C-компилятор для синтаксического анализа для вас, возможно, посредством:
cpp -E
а затем анализируя его вывод на C-языке, в котором из него были выведены операторы CPP, "вымытые"gccxml
и анализ его вывода XML http://gccxml.github.io/HTML/Index.htmlclang
или gcc
используя различные крючки для обработки их внутренних деревьев синтаксического разбора (это то, что, например, XCode делает для обработки в реальном времени) - http://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/Print_version http://clang.llvm.org/docs/InternalsManual.htmlШаг 2. Определите, каков текущий контекст строки в точке (позиция курсора) в вашем редакторе; например
.
оператор против одного, и нужно имя участника (метод, поле)?В этой части вы можете использовать некоторые синтаксические подсказки, не вызывая полного компилятора, и может быть немного хитом или пропуском.
Шаг 3. Найдите все определения, которые находятся в области действия в точке, и выполните требования к типу того, что пользователь может ожидать там. Этот список может включать значения из файлов заголовков, из текущего файла или из локальных областей внутри функции/метода.
Шаг 4. По мере того, как пользователь начинает печатать, сузите выделение только тем, которые соответствуют типу, определенному в 2, который начинается с буквы, уже введенной в слово (хотя вы можете сбросить фразу, т.е. нечувствительны и, возможно, игнорируют _
подчеркивания, поскольку они непоследовательно используются между различными библиотеками и тому подобное)
Шаг 1. C) Создайте хэш-таблицу (возможно, сложение флагов и _
-E) всех "слов, замеченных" в коллекции файлов в проекте, и просто выведите список этих слов, начинающихся с букв, напечатанных так далеко, независимо от типа.
Верьте или нет, потому что для моих относительно редких набегов в C
код я больше не беспокоюсь о включении полного пакета (1B-4) выше в Emacs, я просто использую параметр dabbrev-Expand
(M-/
) который работает как (1C) здесь, и более-часто-чем-не доволен результатами. Если вы пишете редактор специально для обработки кода C и C++, вы, вероятно, захотите попробовать что-то более похожее на (1B-4), я бы ожидал.
#include<sys/scoket.h>
? :)