четверг, 7 октября 2010 г.

QScintilla: создаем свой лексер

Как уже было сказано ранее, QScintilla поддерживает около 80 языков, раскрашивая каждый в соответствии с их синтаксисом. Т.е. для C++ комментарии задаются символом //, а для языка R символом #. Соответственно, раскрашивать в каждом случае надо по своему.

Трудно представить, что кроме этих 80 языков вам может понадобиться что-то свое, но тем не менее такая ситуация возникнуть может и надо знать как тут поступать.

Вообще, есть два способа добавить свой язык для раскраски.
Первый - это правка собственно исходного кода библиотеки qscintilla2.dll.
Достоинства этого метода - простота добавления. Достаточно взять за пример уже какой-нибудь существующий лексер, скопировать его в новый файл, исправить несколько строк, пересобрать библиотеку и, вуаля, новый лексер готов.
Недостаток этого метода очевиден - необходимость пересобирать библиотеку. Хотелось бы обойтись без этого.
Для этого в QScintilla есть путь истинного воина - наследование от QsciLexerCustom и самостоятельное написание алгоритмов раскраски. Это более сложный путь, на мой взгляд, но зато более правильный с концептуальной точки зрения, т.к. не нужно пересобирать библиотеку.

Итак, первое что мы должны сделать - это отнаследоваться от QsciLexerCustom:

#include <qsci/qscilexercustom.h>

class Lexer : public QsciLexerCustom
{
  Q_OBJECT
public:
  //! Конструктор
  Lexer(QObject * parent = 0);
  //! Деструктор
  virtual ~Lexer();
private:
  Lexer(const Lexer &);
  Lexer &operator=(const Lexer &);
};

* This source code was highlighted with Source Code Highlighter.
В следующих выпусках мы продолжим написание своего лексера.

Комментариев нет:

Отправить комментарий