diff options
Diffstat (limited to 'lexers/LexCIL.cxx')
-rw-r--r-- | lexers/LexCIL.cxx | 407 |
1 files changed, 0 insertions, 407 deletions
diff --git a/lexers/LexCIL.cxx b/lexers/LexCIL.cxx deleted file mode 100644 index 4e0fdb696..000000000 --- a/lexers/LexCIL.cxx +++ /dev/null @@ -1,407 +0,0 @@ -// Scintilla source code edit control -/** @file LexCIL.cxx - ** Lexer for Common Intermediate Language - ** Written by Jad Altahan (github.com/xv) - ** CIL manual: https://www.ecma-international.org/publications/standards/Ecma-335.htm - **/ -// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org> -// The License.txt file describes the conditions under which this software may be distributed. - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <stdarg.h> -#include <assert.h> -#include <ctype.h> - -#include <string> -#include <map> -#include <algorithm> - -#include "ILexer.h" -#include "Scintilla.h" -#include "SciLexer.h" - -#include "StringCopy.h" -#include "WordList.h" -#include "LexAccessor.h" -#include "Accessor.h" -#include "StyleContext.h" -#include "CharacterSet.h" -#include "LexerModule.h" -#include "OptionSet.h" -#include "DefaultLexer.h" - -using namespace Scintilla; - -namespace { - // Use an unnamed namespace to protect the functions and classes from name conflicts - -bool IsAWordChar(const int ch) { - return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.'); -} - -bool IsOperator(const int ch) { - if ((ch < 0x80) && (isalnum(ch))) - return false; - - if (strchr("!%&*+-/<=>@^|~()[]{}", ch)) { - return true; - } - - return false; -} - -constexpr bool IsStreamCommentStyle(const int style) noexcept { - return style == SCE_CIL_COMMENT; -} - -struct OptionsCIL { - bool fold; - bool foldComment; - bool foldCommentMultiline; - bool foldCompact; - - OptionsCIL() { - fold = true; - foldComment = false; - foldCommentMultiline = true; - foldCompact = true; - } -}; - -static const char *const cilWordListDesc[] = { - "Primary CIL keywords", - "Metadata", - "Opcode instructions", - 0 -}; - -struct OptionSetCIL : public OptionSet<OptionsCIL> { - OptionSetCIL() { - DefineProperty("fold", &OptionsCIL::fold); - DefineProperty("fold.comment", &OptionsCIL::foldComment); - - DefineProperty("fold.cil.comment.multiline", &OptionsCIL::foldCommentMultiline, - "Set this property to 0 to disable folding multi-line comments when fold.comment=1."); - - DefineProperty("fold.compact", &OptionsCIL::foldCompact); - - DefineWordListSets(cilWordListDesc); - } -}; - -LexicalClass lexicalClasses[] = { - // Lexer CIL SCLEX_CIL SCE_CIL_: - 0, "SCE_CIL_DEFAULT", "default", "White space", - 1, "SCE_CIL_COMMENT", "comment", "Multi-line comment", - 2, "SCE_CIL_COMMENTLINE", "comment line", "Line comment", - 3, "SCE_CIL_WORD", "keyword", "Keyword 1", - 4, "SCE_CIL_WORD2", "keyword", "Keyword 2", - 5, "SCE_CIL_WORD3", "keyword", "Keyword 3", - 6, "SCE_CIL_STRING", "literal string", "Double quoted string", - 7, "SCE_CIL_LABEL", "label", "Code label", - 8, "SCE_CIL_OPERATOR", "operator", "Operators", - 9, "SCE_CIL_STRINGEOL", "error literal string", "String is not closed", - 10, "SCE_CIL_IDENTIFIER", "identifier", "Identifiers", -}; - -} - -class LexerCIL : public DefaultLexer { - WordList keywords, keywords2, keywords3; - OptionsCIL options; - OptionSetCIL osCIL; - -public: - LexerCIL() : DefaultLexer("cil", SCLEX_CIL, lexicalClasses, ELEMENTS(lexicalClasses)) { } - - virtual ~LexerCIL() { } - - void SCI_METHOD Release() override { - delete this; - } - - int SCI_METHOD Version() const override { - return lvRelease5; - } - - const char * SCI_METHOD PropertyNames() override { - return osCIL.PropertyNames(); - } - - int SCI_METHOD PropertyType(const char *name) override { - return osCIL.PropertyType(name); - } - - const char * SCI_METHOD DescribeProperty(const char *name) override { - return osCIL.DescribeProperty(name); - } - - Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; - - const char * SCI_METHOD PropertyGet(const char* key) override { - return osCIL.PropertyGet(key); - } - - const char * SCI_METHOD DescribeWordListSets() override { - return osCIL.DescribeWordListSets(); - } - - Sci_Position SCI_METHOD WordListSet(int n, const char *wl) override; - - void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override; - void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override; - - void * SCI_METHOD PrivateCall(int, void *) override { - return 0; - } - - int SCI_METHOD LineEndTypesSupported() override { - return SC_LINE_END_TYPE_UNICODE; - } - - int SCI_METHOD PrimaryStyleFromStyle(int style) override { - return style; - } - - static ILexer5 *LexerFactoryCIL() { - return new LexerCIL(); - } -}; - -Sci_Position SCI_METHOD LexerCIL::PropertySet(const char *key, const char *val) { - if (osCIL.PropertySet(&options, key, val)) { - return 0; - } - - return -1; -} - -Sci_Position SCI_METHOD LexerCIL::WordListSet(int n, const char *wl) { - WordList *wordListN = 0; - - switch (n) { - case 0: - wordListN = &keywords; - break; - case 1: - wordListN = &keywords2; - break; - case 2: - wordListN = &keywords3; - break; - } - - Sci_Position firstModification = -1; - - if (wordListN) { - WordList wlNew; - wlNew.Set(wl); - - if (*wordListN != wlNew) { - wordListN->Set(wl); - firstModification = 0; - } - } - - return firstModification; -} - -void SCI_METHOD LexerCIL::Lex(Sci_PositionU startPos, Sci_Position length, - int initStyle, IDocument *pAccess) { - if (initStyle == SCE_CIL_STRINGEOL) { - initStyle = SCE_CIL_DEFAULT; - } - - Accessor styler(pAccess, NULL); - StyleContext sc(startPos, length, initStyle, styler); - - bool identAtLineStart = false, // Checks if an identifier is at line start (ignoring spaces) - canStyleLabels = false; // Checks if conditions are met to style SCE_CIL_LABEL - - for (; sc.More(); sc.Forward()) { - if (sc.atLineStart) { - if (sc.state == SCE_CIL_STRING) { - sc.SetState(SCE_CIL_STRING); - } - - identAtLineStart = true; - } - - // Handle string line continuation - if (sc.ch == '\\' && (sc.chNext == '\n' || sc.chNext == '\r') && - (sc.state == SCE_CIL_STRING)) { - sc.Forward(); - - if (sc.ch == '\r' && sc.chNext == '\n') { - sc.Forward(); - } - - continue; - } - - switch (sc.state) { - case SCE_CIL_OPERATOR: - sc.SetState(SCE_CIL_DEFAULT); - break; - case SCE_CIL_IDENTIFIER: - if (!IsAWordChar(sc.ch)) { - if (canStyleLabels && (sc.ch == ':' && sc.chNext != ':')) { - sc.ChangeState(SCE_CIL_LABEL); - sc.ForwardSetState(SCE_CIL_DEFAULT); - } else { - char kwSize[100]; - sc.GetCurrent(kwSize, sizeof(kwSize)); - int style = SCE_CIL_IDENTIFIER; - - if (keywords.InList(kwSize)) { - style = SCE_CIL_WORD; - } else if (keywords2.InList(kwSize)) { - style = SCE_CIL_WORD2; - } else if (keywords3.InList(kwSize)) { - style = SCE_CIL_WORD3; - } - - sc.ChangeState(style); - sc.SetState(SCE_CIL_DEFAULT); - } - } - break; - case SCE_CIL_COMMENT: - if (sc.Match('*', '/')) { - sc.Forward(); - sc.ForwardSetState(SCE_CIL_DEFAULT); - } - break; - case SCE_CIL_COMMENTLINE: - if (sc.atLineStart) { - sc.SetState(SCE_CIL_DEFAULT); - } - break; - case SCE_CIL_STRING: - if (sc.ch == '\\') { - if (sc.chNext == '"' || sc.chNext == '\\') { - sc.Forward(); - } - } else if (sc.ch == '"') { - sc.ForwardSetState(SCE_CIL_DEFAULT); - } else if (sc.atLineEnd) { - sc.ChangeState(SCE_CIL_STRINGEOL); - sc.ForwardSetState(SCE_CIL_DEFAULT); - } - break; - } - - if (sc.state == SCE_CIL_DEFAULT) { - // String - if (sc.ch == '"') { - sc.SetState(SCE_CIL_STRING); - } - // Keyword - else if (IsAWordChar(sc.ch)) { - // Allow setting SCE_CIL_LABEL style only if the label is the - // first token in the line and does not start with a dot or a digit - canStyleLabels = identAtLineStart && !(sc.ch == '.' || IsADigit(sc.ch)); - sc.SetState(SCE_CIL_IDENTIFIER); - } - // Multi-line comment - else if (sc.Match('/', '*')) { - sc.SetState(SCE_CIL_COMMENT); - sc.Forward(); - } - // Line comment - else if (sc.Match('/', '/')) { - sc.SetState(SCE_CIL_COMMENTLINE); - } - // Operators - else if (IsOperator(sc.ch)) { - sc.SetState(SCE_CIL_OPERATOR); - } - } - - if (!IsASpace(sc.ch)) { - identAtLineStart = false; - } - } - - sc.Complete(); -} - -void SCI_METHOD LexerCIL::Fold(Sci_PositionU startPos, Sci_Position length, - int initStyle, IDocument *pAccess) { - if (!options.fold) { - return; - } - - LexAccessor styler(pAccess); - - const Sci_PositionU endPos = startPos + length; - Sci_Position lineCurrent = styler.GetLine(startPos); - - int levelCurrent = SC_FOLDLEVELBASE; - if (lineCurrent > 0) - levelCurrent = styler.LevelAt(lineCurrent - 1) >> 16; - - int style = initStyle; - int styleNext = styler.StyleAt(startPos); - int levelNext = levelCurrent; - int visibleChars = 0; - - char chNext = styler[startPos]; - - for (Sci_PositionU i = startPos; i < endPos; i++) { - const char ch = chNext; - int stylePrev = style; - - chNext = styler.SafeGetCharAt(i + 1); - style = styleNext; - styleNext = styler.StyleAt(i + 1); - - const bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - - if (options.foldComment && - options.foldCommentMultiline && IsStreamCommentStyle(style)) { - if (!IsStreamCommentStyle(stylePrev)) { - levelNext++; - } else if (!IsStreamCommentStyle(styleNext) && !atEOL) { - levelNext--; - } - } - - if (style == SCE_CIL_OPERATOR) { - if (ch == '{') { - levelNext++; - } else if (ch == '}') { - levelNext--; - } - } - - if (!IsASpace(ch)) { - visibleChars++; - } - - if (atEOL || (i == endPos - 1)) { - int lev = levelCurrent | levelNext << 16; - if (visibleChars == 0 && options.foldCompact) - lev |= SC_FOLDLEVELWHITEFLAG; - if (levelCurrent < levelNext) - lev |= SC_FOLDLEVELHEADERFLAG; - if (lev != styler.LevelAt(lineCurrent)) { - styler.SetLevel(lineCurrent, lev); - } - - lineCurrent++; - levelCurrent = levelNext; - - if (options.foldCompact && - i == static_cast<Sci_PositionU>(styler.Length() - 1)) { - styler.SetLevel(lineCurrent, lev | SC_FOLDLEVELWHITEFLAG); - } - - visibleChars = 0; - } - } -} - -LexerModule lmCIL(SCLEX_CIL, LexerCIL::LexerFactoryCIL, "cil", cilWordListDesc);
\ No newline at end of file |