diff options
author | nyamatongwe <unknown> | 2005-02-04 12:02:07 +0000 |
---|---|---|
committer | nyamatongwe <unknown> | 2005-02-04 12:02:07 +0000 |
commit | 4445dc7dc361470d37cfbe9ef567f37b5ad2bd13 (patch) | |
tree | 6add782404437f5339958037fd8a1c7fda770ac9 /src/LexBB.cxx | |
parent | ec099a9f83f1eb631cee326a02c653b79bdc72a8 (diff) | |
download | scintilla-mirror-4445dc7dc361470d37cfbe9ef567f37b5ad2bd13.tar.gz |
Added BlitzBasic lexer and properties file.
Diffstat (limited to 'src/LexBB.cxx')
-rw-r--r-- | src/LexBB.cxx | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/src/LexBB.cxx b/src/LexBB.cxx new file mode 100644 index 000000000..ed1aebd34 --- /dev/null +++ b/src/LexBB.cxx @@ -0,0 +1,178 @@ +// Scintilla source code edit control +/** @file LexBB.cxx + ** Lexer for BlitzBasic. + **/ +// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +// Currently, this only supports the old (2D only) BlitzBasic. But I believe relatively +// few changes would be needed to support the newer versions (Blitz3D, BlitzPlus, +// BlitzMax, ...) - but I don't have them. Mail me (elias <at> users <dot> sf <dot> net) +// for any bugs. + +// Folding works for Function/End Function and Type/End Type only. + +// The generated styles are: +// val SCE_BB_DEFAULT=0 +// val SCE_BB_COMMENT=1 +// val SCE_BB_NUMBER=2 +// val SCE_BB_STRING=3 +// val SCE_BB_OPERATOR=4 +// val SCE_BB_IDENTIFIER=5 +// val SCE_BB_KEYWORD=6 +// val SCE_BB_KEYWORD2=7 +// val SCE_BB_KEYWORD3=8 +// val SCE_BB_KEYWORD4=9 +// val SCE_BB_ERROR=10 + +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <stdarg.h> + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static bool IsOperator(int c) { + return isoperator(static_cast<char>(c)) || c == '#' || c == '$' || c == '\\'; +} + +static bool IsIdentifier(int c) { + return isalnum(c) || c == '_' || c == '.'; +} + +static bool IsDigit(int c) { + return isdigit(c) || c == '.'; +} + +static void ColouriseBBDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + styler.StartAt(startPos); + + StyleContext sc(startPos, length, initStyle, styler); + + // Can't use sc.More() here else we miss the last character + for (; ; sc.Forward()) { + if (sc.state == SCE_BB_IDENTIFIER) { + if (!IsIdentifier(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + for (int i = 0; i < 4; i++) + { + if (keywordlists[i]->InList(s)) { + sc.ChangeState(SCE_BB_KEYWORD + i); + sc.SetState(SCE_BB_IDENTIFIER); + } + } + sc.SetState(SCE_BB_DEFAULT); + } + } else if (sc.state == SCE_BB_OPERATOR) { + if (!IsOperator(sc.ch)) + sc.SetState(SCE_BB_DEFAULT); + } else if (sc.state == SCE_BB_NUMBER) { + if (!IsDigit(sc.ch)) { + sc.SetState(SCE_BB_DEFAULT); + } + } else if (sc.state == SCE_BB_STRING) { + if (sc.ch == '"') { + sc.ForwardSetState(SCE_BB_DEFAULT); + } + if (sc.atLineEnd) { + sc.ChangeState(SCE_BB_ERROR); + sc.SetState(SCE_BB_DEFAULT); + } + } else if (sc.state == SCE_BB_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_BB_DEFAULT); + } + } + + if (sc.state == SCE_BB_DEFAULT || sc.state == SCE_BB_ERROR) { + if (sc.Match(';')) { + sc.SetState(SCE_BB_COMMENT); + } else if (sc.Match('"')) { + sc.SetState(SCE_BB_STRING); + } else if (IsDigit(sc.ch)) { + sc.SetState(SCE_BB_NUMBER); + } else if (IsOperator(sc.ch)) { + sc.SetState(SCE_BB_OPERATOR); + } else if (isalnum(sc.ch) || sc.Match('_')) { + sc.SetState(SCE_BB_IDENTIFIER); + } else if (!isspace(sc.ch)) { + sc.SetState(SCE_BB_ERROR); + } + } + if (!sc.More()) + break; + } + sc.Complete(); +} + +static void FoldBBDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + int line = styler.GetLine(startPos); + int level = styler.LevelAt(line); + int go = 0; + int endPos = startPos + length; + char word[256]; + int wordlen = 0; + int i; + for (i = startPos; i < endPos; i++) { + int c = styler.SafeGetCharAt(i); + if (wordlen) { + word[wordlen] = static_cast<char>(tolower(c)); + if (isspace(c)) { + word[wordlen] = '\0'; + if (!strcmp(word, "function") || + !strcmp(word, "type")) { + level |= SC_FOLDLEVELHEADERFLAG; + go = 1; + } + if (!strcmp(word, "end function") || + !strcmp(word, "end type")) { + go = -1; + } + // Treat any whitespace as single blank. + if (!isspace (word[wordlen - 1])) { + word[wordlen] = ' '; + wordlen++; + } + } else { + wordlen++; + } + } else { + if (!isspace(c)) + word[wordlen++] = static_cast<char>(tolower(c)); + } + if (c == '\n') { + if (wordlen == 0) + level |= SC_FOLDLEVELWHITEFLAG; + if (level != styler.LevelAt(line)) + styler.SetLevel(line, level); + wordlen = 0; + level &= ~SC_FOLDLEVELHEADERFLAG; + level &= ~SC_FOLDLEVELWHITEFLAG; + level += go; + go = 0; + line++; + } + } +} + +static const char * const bbWordListDesc[] = { + "Blitzbasic Keywords", + "user1", + "user2", + "user3", + 0 +}; + +LexerModule lmBB(SCLEX_BB, ColouriseBBDoc, "bb", FoldBBDoc, bbWordListDesc); + |