QScintilla: как создать новый лексер или изменить существующий? - PullRequest
1 голос
/ 04 ноября 2010

Я считаю лексер по умолчанию для выделения C ++ недостаточно конкретным.

Я хочу по крайней мере иметь возможность указать другой цвет для:

введите ключевое слово (void, int, float и т. Д.) ключевое слово инструкции (если пока возвращаются и т. д.) связанное с классом ключевое слово (шаблон класса виртуальный друг) ключевые слова модификаторов типов (статические константы без знака и т. д.)

Я нашел это в источнике LexerCPP:

const char *QsciLexerCPX::keywords(int set) const
{
    if (set == 1)
        return
            "and and_eq asm auto bitand bitor bool break case "
            "catch char class compl const const_cast continue "
            "default delete do double dynamic_cast else enum "
            "explicit export extern false float for friend goto if "
            "inline int long mutable namespace new not not_eq "
            "operator or or_eq private protected public register "
            "reinterpret_cast return short signed sizeof static "
            "static_cast struct switch template this throw true "
            "try typedef typeid typename union unsigned using "
            "virtual void volatile wchar_t while xor xor_eq";

    if (set == 3)
        return
            "a addindex addtogroup anchor arg attention author b "
            "brief bug c class code date def defgroup deprecated "
            "dontinclude e em endcode endhtmlonly endif "
            "endlatexonly endlink endverbatim enum example "
            "exception f$ f[ f] file fn hideinitializer "
            "htmlinclude htmlonly if image include ingroup "
            "internal invariant interface latexonly li line link "
            "mainpage name namespace nosubgrouping note overload "
            "p page par param post pre ref relates remarks return "
            "retval sa section see showinitializer since skip "
            "skipline struct subsection test throw todo typedef "
            "union until var verbatim verbinclude version warning "
            "weakgroup $ @ \\ & < > # { }";

и т.д.

Я пробовал это - Скопируйте / вставьте qscilexercpp.cpp в новое имя файла qscilexercxx.cpp. - замените приведенный выше код переключателем на соответствующий переключатель:

switch(set)
    {
    case Oper:
        //operators
        return
        "and and_eq bitand bitor "
        "catch compl const_cast "
        "delete dynamic_cast "
        "new not not_eq "
        "operator or or_eq "
        "reinterpret_cast sizeof "
        "static_cast throw "
        "try typeid typename "
        "xor xor_eq";

    case BaseType:
        // basic types
        return
        "bool char double enum float int long "
        "short struct union void wchar_t";

    case ClassRelated:
        // class/template-related
        return
        "class inline friend private protected public "
        "template this virtual";

    case Misc:
        // misc
        return
        "asm namespace typedef using";

    case Modifiers:
        // type modifiers
        return
        "auto const explicit extern mutable register "
        "signed static unsigned volatile";

    case Instruct:
        return
        "break case continue default do else "
        "for goto if return switch while";
    }

После создания соответствующего перечисления:

    Oper = 20,
    BaseType = 21,
    ClassRelated = 22,
    Misc = 23,
    Modifiers = 24,
    Instruct = 25

В конце существующих.

Теперь большая часть моего текста чёрная, и я почти уверен, что что-то упустил из-за связи между enum и возвращенным массивом символов char ...

Может кто-нибудь направить меня к чему-то или помочь мне?

...