Каков подход к проектированию минимальной IDE с подсветкой синтаксиса с использованием Java Swing? - PullRequest
0 голосов
/ 27 сентября 2019

Я пишу очень маленький редактор кода для Java с подсветкой синтаксиса (для практики, с очень базовыми знаниями по проектированию компиляторов) и создал базовый лексер для генерации токенов. Для форматирования текста я использую JTextPane.
У меня есть класс Lexer, который принимает входную строку и возвращает токены.

Мой подход такой:

  1. Я добавил прослушиватель документов, который при каждом обновленииполучает текст из текстовой панели и передает его в Lexer.
  2. Lexer возвращает поток токенов для текущего обновления, а также начальную и конечную позиции для каждого токена.
  3. Приемник документов анализирует эти токены каждый рази применяет стили к определенным ключевым словам / идентификаторам.

Уместно ли повторно вызывать Lexer и затем обновлять документ?


Код:

public void documentEventHandler() {

    tokenStream = lexer.generateTokens(editorPane.getText());

    for (Lexer.Token<Lexer.Codes> token : tokenStream) {
        int s = token.getStartIndex();
        int e = token.getEndIndex();

        if (token.t == Lexer.Codes.PRIMITIVE) {
            try {
                doc.setCharacterAttributes(s, e-s, doc.getStyle("bold"), true);
            }
            catch(Exception ee) {
                ee.printStackTrace();
            }
        }
    }
}

Я не хочу заранее определять текст, который должен быть выделен, так как я постепенно планирую добавить семантический анализатор, поэтому хотел обновить его динамическисоюзник в зависимости от положения токена.

Примечания:
Я чувствую этот подход крайне неоптимизированным, как его документ обновления, снова и снова.Но я не могу найти другого выхода, поможет ли здесь многопоточность в этом случае? (Возможно, запуск лексера в другом потоке?)

...