QScintilla: how to create a new lexer or modify an existing one?

穿精又带淫゛_ 提交于 2019-12-23 03:09:22

问题


I find the default lexer for C++ highlighting not very specific enough.

I want to at least be able to specify a different color for:

type keyword (void, int, float etc) instruction keyword (if while do return for etc) class-related keyword (template class virtual friend) type modifiers keywords (static const extern unsigned etc)

I found this in the LexerCPP source:

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 $ @ \\ & < > # { }";

etc

I tried this - Copy/paste the qscilexercpp.cpp to a new file name qscilexercxx.cpp - replace the code above by a switch with an appropriate switch:

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";
    }

After creating the appropriate enum:

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

At the end of the existing ones.

Now most of my text is black, and I'm pretty sure I missed something about the link between the enum and the char array of keywords returned...

Can somebody direct me to something or help me ?

来源:https://stackoverflow.com/questions/4097773/qscintilla-how-to-create-a-new-lexer-or-modify-an-existing-one

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!