diff options
Diffstat (limited to 'lexers/LexVisualProlog.cxx')
-rw-r--r-- | lexers/LexVisualProlog.cxx | 513 |
1 files changed, 0 insertions, 513 deletions
diff --git a/lexers/LexVisualProlog.cxx b/lexers/LexVisualProlog.cxx deleted file mode 100644 index ba5b222c1..000000000 --- a/lexers/LexVisualProlog.cxx +++ /dev/null @@ -1,513 +0,0 @@ -// Scintilla source code edit control -/** @file LexVisualProlog.cxx -** Lexer for Visual Prolog. -**/ -// Author Thomas Linder Puls, Prolog Development Denter A/S, http://www.visual-prolog.com -// Based on Lexer for C++, C, Java, and JavaScript. -// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org> -// The License.txt file describes the conditions under which this software may be distributed. - -// The line state contains: -// In SCE_VISUALPROLOG_STRING_VERBATIM_EOL (i.e. multiline string literal): The closingQuote. -// else (for SCE_VISUALPROLOG_COMMENT_BLOCK): The comment nesting level - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <stdarg.h> -#include <assert.h> -#include <ctype.h> - -#ifdef _MSC_VER -#pragma warning(disable: 4786) -#endif - -#include <string> -#include <vector> -#include <map> -#include <algorithm> - -#include "ILexer.h" -#include "Scintilla.h" -#include "SciLexer.h" - -#include "WordList.h" -#include "LexAccessor.h" -#include "Accessor.h" -#include "StyleContext.h" -#include "CharacterSet.h" -#include "CharacterCategory.h" -#include "LexerModule.h" -#include "OptionSet.h" -#include "DefaultLexer.h" - -using namespace Scintilla; - -// Options used for LexerVisualProlog -struct OptionsVisualProlog { - OptionsVisualProlog() { - } -}; - -static const char *const visualPrologWordLists[] = { - "Major keywords (class, predicates, ...)", - "Minor keywords (if, then, try, ...)", - "Directive keywords without the '#' (include, requires, ...)", - "Documentation keywords without the '@' (short, detail, ...)", - 0, -}; - -struct OptionSetVisualProlog : public OptionSet<OptionsVisualProlog> { - OptionSetVisualProlog() { - DefineWordListSets(visualPrologWordLists); - } -}; - -class LexerVisualProlog : public DefaultLexer { - WordList majorKeywords; - WordList minorKeywords; - WordList directiveKeywords; - WordList docKeywords; - OptionsVisualProlog options; - OptionSetVisualProlog osVisualProlog; -public: - LexerVisualProlog() : DefaultLexer("visualprolog", SCLEX_VISUALPROLOG) { - } - virtual ~LexerVisualProlog() { - } - void SCI_METHOD Release() override { - delete this; - } - int SCI_METHOD Version() const override { - return lvRelease5; - } - const char * SCI_METHOD PropertyNames() override { - return osVisualProlog.PropertyNames(); - } - int SCI_METHOD PropertyType(const char *name) override { - return osVisualProlog.PropertyType(name); - } - const char * SCI_METHOD DescribeProperty(const char *name) override { - return osVisualProlog.DescribeProperty(name); - } - Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; - const char * SCI_METHOD PropertyGet(const char *key) override { - return osVisualProlog.PropertyGet(key); - } - const char * SCI_METHOD DescribeWordListSets() override { - return osVisualProlog.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; - } - - static ILexer5 *LexerFactoryVisualProlog() { - return new LexerVisualProlog(); - } -}; - -Sci_Position SCI_METHOD LexerVisualProlog::PropertySet(const char *key, const char *val) { - if (osVisualProlog.PropertySet(&options, key, val)) { - return 0; - } - return -1; -} - -Sci_Position SCI_METHOD LexerVisualProlog::WordListSet(int n, const char *wl) { - WordList *wordListN = 0; - switch (n) { - case 0: - wordListN = &majorKeywords; - break; - case 1: - wordListN = &minorKeywords; - break; - case 2: - wordListN = &directiveKeywords; - break; - case 3: - wordListN = &docKeywords; - break; - } - Sci_Position firstModification = -1; - if (wordListN) { - WordList wlNew; - wlNew.Set(wl); - if (*wordListN != wlNew) { - wordListN->Set(wl); - firstModification = 0; - } - } - return firstModification; -} - -// Functor used to truncate history -struct After { - Sci_Position line; - After(Sci_Position line_) : line(line_) {} -}; - -static bool isLowerLetter(int ch){ - return ccLl == CategoriseCharacter(ch); -} - -static bool isUpperLetter(int ch){ - return ccLu == CategoriseCharacter(ch); -} - -static bool isAlphaNum(int ch){ - CharacterCategory cc = CategoriseCharacter(ch); - return (ccLu == cc || ccLl == cc || ccLt == cc || ccLm == cc || ccLo == cc || ccNd == cc || ccNl == cc || ccNo == cc); -} - -static bool isStringVerbatimOpenClose(int ch){ - CharacterCategory cc = CategoriseCharacter(ch); - return (ccPc <= cc && cc <= ccSo); -} - -static bool isIdChar(int ch){ - return ('_') == ch || isAlphaNum(ch); -} - -static bool isOpenStringVerbatim(int next, int &closingQuote){ - switch (next) { - case L'<': - closingQuote = L'>'; - return true; - case L'>': - closingQuote = L'<'; - return true; - case L'(': - closingQuote = L')'; - return true; - case L')': - closingQuote = L'('; - return true; - case L'[': - closingQuote = L']'; - return true; - case L']': - closingQuote = L'['; - return true; - case L'{': - closingQuote = L'}'; - return true; - case L'}': - closingQuote = L'{'; - return true; - case L'_': - case L'.': - case L',': - case L';': - return false; - default: - if (isStringVerbatimOpenClose(next)) { - closingQuote = next; - return true; - } else { - return false; - } - } -} - -// Look ahead to see which colour "end" should have (takes colour after the following keyword) -static void endLookAhead(char s[], LexAccessor &styler, Sci_Position start) { - char ch = styler.SafeGetCharAt(start, '\n'); - while (' ' == ch) { - start++; - ch = styler.SafeGetCharAt(start, '\n'); - } - Sci_Position i = 0; - while (i < 100 && isLowerLetter(ch)){ - s[i] = ch; - i++; - ch = styler.SafeGetCharAt(start + i, '\n'); - } - s[i] = '\0'; -} - -static void forwardEscapeLiteral(StyleContext &sc, int EscapeState) { - sc.Forward(); - if (sc.Match('"') || sc.Match('\'') || sc.Match('\\') || sc.Match('n') || sc.Match('l') || sc.Match('r') || sc.Match('t')) { - sc.ChangeState(EscapeState); - } else if (sc.Match('u')) { - if (IsADigit(sc.chNext, 16)) { - sc.Forward(); - if (IsADigit(sc.chNext, 16)) { - sc.Forward(); - if (IsADigit(sc.chNext, 16)) { - sc.Forward(); - if (IsADigit(sc.chNext, 16)) { - sc.Forward(); - sc.ChangeState(EscapeState); - } - } - } - } - } -} - -void SCI_METHOD LexerVisualProlog::Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) { - LexAccessor styler(pAccess); - CharacterSet setDoxygen(CharacterSet::setAlpha, ""); - CharacterSet setNumber(CharacterSet::setNone, "0123456789abcdefABCDEFxoXO"); - - StyleContext sc(startPos, length, initStyle, styler, 0x7f); - - int styleBeforeDocKeyword = SCE_VISUALPROLOG_DEFAULT; - Sci_Position currentLine = styler.GetLine(startPos); - - int closingQuote = '"'; - int nestLevel = 0; - if (currentLine >= 1) - { - nestLevel = styler.GetLineState(currentLine - 1); - closingQuote = nestLevel; - } - - // Truncate ppDefineHistory before current line - - for (; sc.More(); sc.Forward()) { - - // Determine if the current state should terminate. - switch (sc.state) { - case SCE_VISUALPROLOG_OPERATOR: - sc.SetState(SCE_VISUALPROLOG_DEFAULT); - break; - case SCE_VISUALPROLOG_NUMBER: - // We accept almost anything because of hex. and number suffixes - if (!(setNumber.Contains(sc.ch)) || (sc.Match('.') && IsADigit(sc.chNext))) { - sc.SetState(SCE_VISUALPROLOG_DEFAULT); - } - break; - case SCE_VISUALPROLOG_IDENTIFIER: - if (!isIdChar(sc.ch)) { - char s[1000]; - sc.GetCurrent(s, sizeof(s)); - if (0 == strcmp(s, "end")) { - endLookAhead(s, styler, sc.currentPos); - } - if (majorKeywords.InList(s)) { - sc.ChangeState(SCE_VISUALPROLOG_KEY_MAJOR); - } else if (minorKeywords.InList(s)) { - sc.ChangeState(SCE_VISUALPROLOG_KEY_MINOR); - } - sc.SetState(SCE_VISUALPROLOG_DEFAULT); - } - break; - case SCE_VISUALPROLOG_VARIABLE: - case SCE_VISUALPROLOG_ANONYMOUS: - if (!isIdChar(sc.ch)) { - sc.SetState(SCE_VISUALPROLOG_DEFAULT); - } - break; - case SCE_VISUALPROLOG_KEY_DIRECTIVE: - if (!isLowerLetter(sc.ch)) { - char s[1000]; - sc.GetCurrent(s, sizeof(s)); - if (!directiveKeywords.InList(s+1)) { - sc.ChangeState(SCE_VISUALPROLOG_IDENTIFIER); - } - sc.SetState(SCE_VISUALPROLOG_DEFAULT); - } - break; - case SCE_VISUALPROLOG_COMMENT_BLOCK: - if (sc.Match('*', '/')) { - sc.Forward(); - nestLevel--; - int nextState = (nestLevel == 0) ? SCE_VISUALPROLOG_DEFAULT : SCE_VISUALPROLOG_COMMENT_BLOCK; - sc.ForwardSetState(nextState); - } else if (sc.Match('/', '*')) { - sc.Forward(); - nestLevel++; - } else if (sc.Match('@')) { - styleBeforeDocKeyword = sc.state; - sc.SetState(SCE_VISUALPROLOG_COMMENT_KEY_ERROR); - } - break; - case SCE_VISUALPROLOG_COMMENT_LINE: - if (sc.atLineEnd) { - int nextState = (nestLevel == 0) ? SCE_VISUALPROLOG_DEFAULT : SCE_VISUALPROLOG_COMMENT_BLOCK; - sc.SetState(nextState); - } else if (sc.Match('@')) { - styleBeforeDocKeyword = sc.state; - sc.SetState(SCE_VISUALPROLOG_COMMENT_KEY_ERROR); - } - break; - case SCE_VISUALPROLOG_COMMENT_KEY_ERROR: - if (!setDoxygen.Contains(sc.ch) || sc.atLineEnd) { - char s[1000]; - sc.GetCurrent(s, sizeof(s)); - if (docKeywords.InList(s+1)) { - sc.ChangeState(SCE_VISUALPROLOG_COMMENT_KEY); - } - if (SCE_VISUALPROLOG_COMMENT_LINE == styleBeforeDocKeyword && sc.atLineEnd) { - // end line comment - int nextState = (nestLevel == 0) ? SCE_VISUALPROLOG_DEFAULT : SCE_VISUALPROLOG_COMMENT_BLOCK; - sc.SetState(nextState); - } else { - sc.SetState(styleBeforeDocKeyword); - if (SCE_VISUALPROLOG_COMMENT_BLOCK == styleBeforeDocKeyword && sc.Match('*', '/')) { - // we have consumed the '*' if it comes immediately after the docKeyword - sc.Forward(); - sc.Forward(); - nestLevel--; - if (0 == nestLevel) { - sc.SetState(SCE_VISUALPROLOG_DEFAULT); - } - } - } - } - break; - case SCE_VISUALPROLOG_STRING_ESCAPE: - case SCE_VISUALPROLOG_STRING_ESCAPE_ERROR: - // return to SCE_VISUALPROLOG_STRING and treat as such (fall-through) - sc.SetState(SCE_VISUALPROLOG_STRING); - // Falls through. - case SCE_VISUALPROLOG_STRING: - if (sc.atLineEnd) { - sc.SetState(SCE_VISUALPROLOG_STRING_EOL_OPEN); - } else if (sc.Match(closingQuote)) { - sc.ForwardSetState(SCE_VISUALPROLOG_DEFAULT); - } else if (sc.Match('\\')) { - sc.SetState(SCE_VISUALPROLOG_STRING_ESCAPE_ERROR); - forwardEscapeLiteral(sc, SCE_VISUALPROLOG_STRING_ESCAPE); - } - break; - case SCE_VISUALPROLOG_STRING_EOL_OPEN: - if (sc.atLineStart) { - sc.SetState(SCE_VISUALPROLOG_DEFAULT); - } - break; - case SCE_VISUALPROLOG_STRING_VERBATIM_SPECIAL: - case SCE_VISUALPROLOG_STRING_VERBATIM_EOL: - // return to SCE_VISUALPROLOG_STRING_VERBATIM and treat as such (fall-through) - sc.SetState(SCE_VISUALPROLOG_STRING_VERBATIM); - // Falls through. - case SCE_VISUALPROLOG_STRING_VERBATIM: - if (sc.atLineEnd) { - sc.SetState(SCE_VISUALPROLOG_STRING_VERBATIM_EOL); - } else if (sc.Match(closingQuote)) { - if (closingQuote == sc.chNext) { - sc.SetState(SCE_VISUALPROLOG_STRING_VERBATIM_SPECIAL); - sc.Forward(); - } else { - sc.ForwardSetState(SCE_VISUALPROLOG_DEFAULT); - } - } - break; - } - - if (sc.atLineEnd) { - // Update the line state, so it can be seen by next line - int lineState = 0; - if (SCE_VISUALPROLOG_STRING_VERBATIM_EOL == sc.state) { - lineState = closingQuote; - } else if (SCE_VISUALPROLOG_COMMENT_BLOCK == sc.state) { - lineState = nestLevel; - } - styler.SetLineState(currentLine, lineState); - currentLine++; - } - - // Determine if a new state should be entered. - if (sc.state == SCE_VISUALPROLOG_DEFAULT) { - if (sc.Match('@') && isOpenStringVerbatim(sc.chNext, closingQuote)) { - sc.SetState(SCE_VISUALPROLOG_STRING_VERBATIM); - sc.Forward(); - } else if (IsADigit(sc.ch) || (sc.Match('.') && IsADigit(sc.chNext))) { - sc.SetState(SCE_VISUALPROLOG_NUMBER); - } else if (isLowerLetter(sc.ch)) { - sc.SetState(SCE_VISUALPROLOG_IDENTIFIER); - } else if (isUpperLetter(sc.ch)) { - sc.SetState(SCE_VISUALPROLOG_VARIABLE); - } else if (sc.Match('_')) { - sc.SetState(SCE_VISUALPROLOG_ANONYMOUS); - } else if (sc.Match('/', '*')) { - sc.SetState(SCE_VISUALPROLOG_COMMENT_BLOCK); - nestLevel = 1; - sc.Forward(); // Eat the * so it isn't used for the end of the comment - } else if (sc.Match('%')) { - sc.SetState(SCE_VISUALPROLOG_COMMENT_LINE); - } else if (sc.Match('\'')) { - closingQuote = '\''; - sc.SetState(SCE_VISUALPROLOG_STRING); - } else if (sc.Match('"')) { - closingQuote = '"'; - sc.SetState(SCE_VISUALPROLOG_STRING); - } else if (sc.Match('#')) { - sc.SetState(SCE_VISUALPROLOG_KEY_DIRECTIVE); - } else if (isoperator(static_cast<char>(sc.ch)) || sc.Match('\\')) { - sc.SetState(SCE_VISUALPROLOG_OPERATOR); - } - } - - } - sc.Complete(); - styler.Flush(); -} - -// Store both the current line's fold level and the next lines in the -// level store to make it easy to pick up with each increment -// and to make it possible to fiddle the current level for "} else {". - -void SCI_METHOD LexerVisualProlog::Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) { - - LexAccessor styler(pAccess); - - Sci_PositionU endPos = startPos + length; - int visibleChars = 0; - Sci_Position currentLine = styler.GetLine(startPos); - int levelCurrent = SC_FOLDLEVELBASE; - if (currentLine > 0) - levelCurrent = styler.LevelAt(currentLine-1) >> 16; - int levelMinCurrent = levelCurrent; - int levelNext = levelCurrent; - char chNext = styler[startPos]; - int styleNext = styler.StyleAt(startPos); - int style = initStyle; - for (Sci_PositionU i = startPos; i < endPos; i++) { - char ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - style = styleNext; - styleNext = styler.StyleAt(i + 1); - bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - if (style == SCE_VISUALPROLOG_OPERATOR) { - if (ch == '{') { - // Measure the minimum before a '{' to allow - // folding on "} else {" - if (levelMinCurrent > levelNext) { - levelMinCurrent = levelNext; - } - levelNext++; - } else if (ch == '}') { - levelNext--; - } - } - if (!IsASpace(ch)) - visibleChars++; - if (atEOL || (i == endPos-1)) { - int levelUse = levelCurrent; - int lev = levelUse | levelNext << 16; - if (levelUse < levelNext) - lev |= SC_FOLDLEVELHEADERFLAG; - if (lev != styler.LevelAt(currentLine)) { - styler.SetLevel(currentLine, lev); - } - currentLine++; - levelCurrent = levelNext; - levelMinCurrent = levelCurrent; - if (atEOL && (i == static_cast<Sci_PositionU>(styler.Length()-1))) { - // There is an empty line at end of file so give it same level and empty - styler.SetLevel(currentLine, (levelCurrent | levelCurrent << 16) | SC_FOLDLEVELWHITEFLAG); - } - visibleChars = 0; - } - } -} - -LexerModule lmVisualProlog(SCLEX_VISUALPROLOG, LexerVisualProlog::LexerFactoryVisualProlog, "visualprolog", visualPrologWordLists); |