Я пишу очень маленький редактор кода для Java с подсветкой синтаксиса (для практики, с очень базовыми знаниями по проектированию компиляторов) и создал базовый лексер для генерации токенов. Для форматирования текста я использую JTextPane.
У меня есть класс Lexer, который принимает входную строку и возвращает токены.
Мой подход такой:
- Я добавил прослушиватель документов, который при каждом обновленииполучает текст из текстовой панели и передает его в Lexer.
- Lexer возвращает поток токенов для текущего обновления, а также начальную и конечную позиции для каждого токена.
- Приемник документов анализирует эти токены каждый рази применяет стили к определенным ключевым словам / идентификаторам.
Уместно ли повторно вызывать 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();
}
}
}
}
Я не хочу заранее определять текст, который должен быть выделен, так как я постепенно планирую добавить семантический анализатор, поэтому хотел обновить его динамическисоюзник в зависимости от положения токена.
Примечания:
Я чувствую этот подход крайне неоптимизированным, как его документ обновления, снова и снова.Но я не могу найти другого выхода, поможет ли здесь многопоточность в этом случае? (Возможно, запуск лексера в другом потоке?)