1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file LexerModule.h
3*8af74909SZhong Yang ** Colourise for particular languages.
4*8af74909SZhong Yang **/
5*8af74909SZhong Yang // Copyright 1998-2001 by Neil Hodgson <[email protected]>
6*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
7*8af74909SZhong Yang
8*8af74909SZhong Yang #ifndef LEXERMODULE_H
9*8af74909SZhong Yang #define LEXERMODULE_H
10*8af74909SZhong Yang
11*8af74909SZhong Yang namespace Scintilla {
12*8af74909SZhong Yang
13*8af74909SZhong Yang class Accessor;
14*8af74909SZhong Yang class WordList;
15*8af74909SZhong Yang struct LexicalClass;
16*8af74909SZhong Yang
17*8af74909SZhong Yang typedef void (*LexerFunction)(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle,
18*8af74909SZhong Yang WordList *keywordlists[], Accessor &styler);
19*8af74909SZhong Yang typedef ILexer5 *(*LexerFactoryFunction)();
20*8af74909SZhong Yang
21*8af74909SZhong Yang /**
22*8af74909SZhong Yang * A LexerModule is responsible for lexing and folding a particular language.
23*8af74909SZhong Yang * The Catalogue class maintains a list of LexerModules which can be searched to find a
24*8af74909SZhong Yang * module appropriate to a particular language.
25*8af74909SZhong Yang * The ExternalLexerModule subclass holds lexers loaded from DLLs or shared libraries.
26*8af74909SZhong Yang */
27*8af74909SZhong Yang class LexerModule {
28*8af74909SZhong Yang protected:
29*8af74909SZhong Yang int language;
30*8af74909SZhong Yang LexerFunction fnLexer;
31*8af74909SZhong Yang LexerFunction fnFolder;
32*8af74909SZhong Yang LexerFactoryFunction fnFactory;
33*8af74909SZhong Yang const char * const * wordListDescriptions;
34*8af74909SZhong Yang const LexicalClass *lexClasses;
35*8af74909SZhong Yang size_t nClasses;
36*8af74909SZhong Yang
37*8af74909SZhong Yang public:
38*8af74909SZhong Yang const char *languageName;
39*8af74909SZhong Yang LexerModule(
40*8af74909SZhong Yang int language_,
41*8af74909SZhong Yang LexerFunction fnLexer_,
42*8af74909SZhong Yang const char *languageName_=nullptr,
43*8af74909SZhong Yang LexerFunction fnFolder_= nullptr,
44*8af74909SZhong Yang const char * const wordListDescriptions_[]=nullptr,
45*8af74909SZhong Yang const LexicalClass *lexClasses_=nullptr,
46*8af74909SZhong Yang size_t nClasses_=0) noexcept;
47*8af74909SZhong Yang LexerModule(
48*8af74909SZhong Yang int language_,
49*8af74909SZhong Yang LexerFactoryFunction fnFactory_,
50*8af74909SZhong Yang const char *languageName_,
51*8af74909SZhong Yang const char * const wordListDescriptions_[]=nullptr) noexcept;
52*8af74909SZhong Yang int GetLanguage() const noexcept;
53*8af74909SZhong Yang
54*8af74909SZhong Yang // -1 is returned if no WordList information is available
55*8af74909SZhong Yang int GetNumWordLists() const noexcept;
56*8af74909SZhong Yang const char *GetWordListDescription(int index) const noexcept;
57*8af74909SZhong Yang const LexicalClass *LexClasses() const noexcept;
58*8af74909SZhong Yang size_t NamedStyles() const noexcept;
59*8af74909SZhong Yang
60*8af74909SZhong Yang ILexer5 *Create() const;
61*8af74909SZhong Yang
62*8af74909SZhong Yang void Lex(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle,
63*8af74909SZhong Yang WordList *keywordlists[], Accessor &styler) const;
64*8af74909SZhong Yang void Fold(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle,
65*8af74909SZhong Yang WordList *keywordlists[], Accessor &styler) const;
66*8af74909SZhong Yang
67*8af74909SZhong Yang friend class CatalogueModules;
68*8af74909SZhong Yang };
69*8af74909SZhong Yang
Maximum(int a,int b)70*8af74909SZhong Yang inline int Maximum(int a, int b) noexcept {
71*8af74909SZhong Yang return (a > b) ? a : b;
72*8af74909SZhong Yang }
73*8af74909SZhong Yang
74*8af74909SZhong Yang // Shut up annoying Visual C++ warnings:
75*8af74909SZhong Yang #ifdef _MSC_VER
76*8af74909SZhong Yang #pragma warning(disable: 4244 4456 4457)
77*8af74909SZhong Yang #endif
78*8af74909SZhong Yang
79*8af74909SZhong Yang // Turn off shadow warnings for lexers as may be maintained by others
80*8af74909SZhong Yang #if defined(__GNUC__)
81*8af74909SZhong Yang #pragma GCC diagnostic ignored "-Wshadow"
82*8af74909SZhong Yang #endif
83*8af74909SZhong Yang
84*8af74909SZhong Yang // Clang doesn't like omitting braces in array initialization but they just add
85*8af74909SZhong Yang // noise to LexicalClass arrays in lexers
86*8af74909SZhong Yang #if defined(__clang__)
87*8af74909SZhong Yang #pragma clang diagnostic ignored "-Wmissing-braces"
88*8af74909SZhong Yang #endif
89*8af74909SZhong Yang
90*8af74909SZhong Yang }
91*8af74909SZhong Yang
92*8af74909SZhong Yang #endif
93