aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexers/LexVisualProlog.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'lexers/LexVisualProlog.cxx')
-rw-r--r--lexers/LexVisualProlog.cxx513
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);