diff options
| author | nyamatongwe <unknown> | 2010-07-13 21:16:48 +1000 | 
|---|---|---|
| committer | nyamatongwe <unknown> | 2010-07-13 21:16:48 +1000 | 
| commit | fd7c21165bbc5200aa24ef89560a8bb40fd37255 (patch) | |
| tree | b5cdec307f1b412f0527eb826a14b806b58cf006 /src/LexLua.cxx | |
| parent | d47313970ebf3736afffec781f2f9030fa3c8e1a (diff) | |
| download | scintilla-mirror-fd7c21165bbc5200aa24ef89560a8bb40fd37255.tar.gz | |
Moved lexers into lexers directory.
Diffstat (limited to 'src/LexLua.cxx')
| -rw-r--r-- | src/LexLua.cxx | 358 | 
1 files changed, 0 insertions, 358 deletions
| diff --git a/src/LexLua.cxx b/src/LexLua.cxx deleted file mode 100644 index a1e579f26..000000000 --- a/src/LexLua.cxx +++ /dev/null @@ -1,358 +0,0 @@ -// Scintilla source code edit control -/** @file LexLua.cxx - ** Lexer for Lua language. - ** - ** Written by Paul Winwood. - ** Folder by Alexey Yutkin. - ** Modified by Marcos E. Wurzius & Philippe Lhoste - **/ - -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <stdarg.h> -#include <stdio.h> - -#include "Platform.h" - -#include "PropSet.h" -#include "Accessor.h" -#include "StyleContext.h" -#include "KeyWords.h" -#include "Scintilla.h" -#include "SciLexer.h" -#include "CharacterSet.h" - -#ifdef SCI_NAMESPACE -using namespace Scintilla; -#endif - -// Test for [=[ ... ]=] delimiters, returns 0 if it's only a [ or ], -// return 1 for [[ or ]], returns >=2 for [=[ or ]=] and so on. -// The maximum number of '=' characters allowed is 254. -static int LongDelimCheck(StyleContext &sc) { -	int sep = 1; -	while (sc.GetRelative(sep) == '=' && sep < 0xFF) -		sep++; -	if (sc.GetRelative(sep) == sc.ch) -		return sep; -	return 0; -} - -static void ColouriseLuaDoc( -	unsigned int startPos, -	int length, -	int initStyle, -	WordList *keywordlists[], -	Accessor &styler) { - -	WordList &keywords = *keywordlists[0]; -	WordList &keywords2 = *keywordlists[1]; -	WordList &keywords3 = *keywordlists[2]; -	WordList &keywords4 = *keywordlists[3]; -	WordList &keywords5 = *keywordlists[4]; -	WordList &keywords6 = *keywordlists[5]; -	WordList &keywords7 = *keywordlists[6]; -	WordList &keywords8 = *keywordlists[7]; - -	// Accepts accented characters -	CharacterSet setWordStart(CharacterSet::setAlpha, "_", 0x80, true); -	CharacterSet setWord(CharacterSet::setAlphaNum, "._", 0x80, true); -	// Not exactly following number definition (several dots are seen as OK, etc.) -	// but probably enough in most cases. -	CharacterSet setNumber(CharacterSet::setDigits, ".-+abcdefABCDEF"); -	CharacterSet setLuaOperator(CharacterSet::setNone, "*/-+()={}~[];<>,.^%:#"); -	CharacterSet setEscapeSkip(CharacterSet::setNone, "\"'\\"); - -	int currentLine = styler.GetLine(startPos); -	// Initialize long string [[ ... ]] or block comment --[[ ... ]] nesting level, -	// if we are inside such a string. Block comment was introduced in Lua 5.0, -	// blocks with separators [=[ ... ]=] in Lua 5.1. -	int nestLevel = 0; -	int sepCount = 0; -	if (initStyle == SCE_LUA_LITERALSTRING || initStyle == SCE_LUA_COMMENT) { -		int lineState = styler.GetLineState(currentLine - 1); -		nestLevel = lineState >> 8; -		sepCount = lineState & 0xFF; -	} - -	// Do not leak onto next line -	if (initStyle == SCE_LUA_STRINGEOL || initStyle == SCE_LUA_COMMENTLINE || initStyle == SCE_LUA_PREPROCESSOR) { -		initStyle = SCE_LUA_DEFAULT; -	} - -	StyleContext sc(startPos, length, initStyle, styler); -	if (startPos == 0 && sc.ch == '#') { -		// shbang line: # is a comment only if first char of the script -		sc.SetState(SCE_LUA_COMMENTLINE); -	} -	for (; sc.More(); sc.Forward()) { -		if (sc.atLineEnd) { -			// Update the line state, so it can be seen by next line -			currentLine = styler.GetLine(sc.currentPos); -			switch (sc.state) { -			case SCE_LUA_LITERALSTRING: -			case SCE_LUA_COMMENT: -				// Inside a literal string or block comment, we set the line state -				styler.SetLineState(currentLine, (nestLevel << 8) | sepCount); -				break; -			default: -				// Reset the line state -				styler.SetLineState(currentLine, 0); -				break; -			} -		} -		if (sc.atLineStart && (sc.state == SCE_LUA_STRING)) { -			// Prevent SCE_LUA_STRINGEOL from leaking back to previous line -			sc.SetState(SCE_LUA_STRING); -		} - -		// Handle string line continuation -		if ((sc.state == SCE_LUA_STRING || sc.state == SCE_LUA_CHARACTER) && -				sc.ch == '\\') { -			if (sc.chNext == '\n' || sc.chNext == '\r') { -				sc.Forward(); -				if (sc.ch == '\r' && sc.chNext == '\n') { -					sc.Forward(); -				} -				continue; -			} -		} - -		// Determine if the current state should terminate. -		if (sc.state == SCE_LUA_OPERATOR) { -			sc.SetState(SCE_LUA_DEFAULT); -		} else if (sc.state == SCE_LUA_NUMBER) { -			// We stop the number definition on non-numerical non-dot non-eE non-sign non-hexdigit char -			if (!setNumber.Contains(sc.ch)) { -				sc.SetState(SCE_LUA_DEFAULT); -			} else if (sc.ch == '-' || sc.ch == '+') { -				if (sc.chPrev != 'E' && sc.chPrev != 'e') -					sc.SetState(SCE_LUA_DEFAULT); -			} -		} else if (sc.state == SCE_LUA_IDENTIFIER) { -			if (!setWord.Contains(sc.ch) || sc.Match('.', '.')) { -				char s[100]; -				sc.GetCurrent(s, sizeof(s)); -				if (keywords.InList(s)) { -					sc.ChangeState(SCE_LUA_WORD); -				} else if (keywords2.InList(s)) { -					sc.ChangeState(SCE_LUA_WORD2); -				} else if (keywords3.InList(s)) { -					sc.ChangeState(SCE_LUA_WORD3); -				} else if (keywords4.InList(s)) { -					sc.ChangeState(SCE_LUA_WORD4); -				} else if (keywords5.InList(s)) { -					sc.ChangeState(SCE_LUA_WORD5); -				} else if (keywords6.InList(s)) { -					sc.ChangeState(SCE_LUA_WORD6); -				} else if (keywords7.InList(s)) { -					sc.ChangeState(SCE_LUA_WORD7); -				} else if (keywords8.InList(s)) { -					sc.ChangeState(SCE_LUA_WORD8); -				} -				sc.SetState(SCE_LUA_DEFAULT); -			} -		} else if (sc.state == SCE_LUA_COMMENTLINE || sc.state == SCE_LUA_PREPROCESSOR) { -			if (sc.atLineEnd) { -				sc.ForwardSetState(SCE_LUA_DEFAULT); -			} -		} else if (sc.state == SCE_LUA_STRING) { -			if (sc.ch == '\\') { -				if (setEscapeSkip.Contains(sc.chNext)) { -					sc.Forward(); -				} -			} else if (sc.ch == '\"') { -				sc.ForwardSetState(SCE_LUA_DEFAULT); -			} else if (sc.atLineEnd) { -				sc.ChangeState(SCE_LUA_STRINGEOL); -				sc.ForwardSetState(SCE_LUA_DEFAULT); -			} -		} else if (sc.state == SCE_LUA_CHARACTER) { -			if (sc.ch == '\\') { -				if (setEscapeSkip.Contains(sc.chNext)) { -					sc.Forward(); -				} -			} else if (sc.ch == '\'') { -				sc.ForwardSetState(SCE_LUA_DEFAULT); -			} else if (sc.atLineEnd) { -				sc.ChangeState(SCE_LUA_STRINGEOL); -				sc.ForwardSetState(SCE_LUA_DEFAULT); -			} -		} else if (sc.state == SCE_LUA_LITERALSTRING || sc.state == SCE_LUA_COMMENT) { -			if (sc.ch == '[') { -				int sep = LongDelimCheck(sc); -				if (sep == 1 && sepCount == 1) {    // [[-only allowed to nest -					nestLevel++; -					sc.Forward(); -				} -			} else if (sc.ch == ']') { -				int sep = LongDelimCheck(sc); -				if (sep == 1 && sepCount == 1) {    // un-nest with ]]-only -					nestLevel--; -					sc.Forward(); -					if (nestLevel == 0) { -						sc.ForwardSetState(SCE_LUA_DEFAULT); -					} -				} else if (sep > 1 && sep == sepCount) {   // ]=]-style delim -					sc.Forward(sep); -					sc.ForwardSetState(SCE_LUA_DEFAULT); -				} -			} -		} - -		// Determine if a new state should be entered. -		if (sc.state == SCE_LUA_DEFAULT) { -			if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { -				sc.SetState(SCE_LUA_NUMBER); -				if (sc.ch == '0' && toupper(sc.chNext) == 'X') { -					sc.Forward(); -				} -			} else if (setWordStart.Contains(sc.ch)) { -				sc.SetState(SCE_LUA_IDENTIFIER); -			} else if (sc.ch == '\"') { -				sc.SetState(SCE_LUA_STRING); -			} else if (sc.ch == '\'') { -				sc.SetState(SCE_LUA_CHARACTER); -			} else if (sc.ch == '[') { -				sepCount = LongDelimCheck(sc); -				if (sepCount == 0) { -					sc.SetState(SCE_LUA_OPERATOR); -				} else { -					nestLevel = 1; -					sc.SetState(SCE_LUA_LITERALSTRING); -					sc.Forward(sepCount); -				} -			} else if (sc.Match('-', '-')) { -				sc.SetState(SCE_LUA_COMMENTLINE); -				if (sc.Match("--[")) { -					sc.Forward(2); -					sepCount = LongDelimCheck(sc); -					if (sepCount > 0) { -						nestLevel = 1; -						sc.ChangeState(SCE_LUA_COMMENT); -						sc.Forward(sepCount); -					} -				} else { -					sc.Forward(); -				} -			} else if (sc.atLineStart && sc.Match('$')) { -				sc.SetState(SCE_LUA_PREPROCESSOR);	// Obsolete since Lua 4.0, but still in old code -			} else if (setLuaOperator.Contains(sc.ch)) { -				sc.SetState(SCE_LUA_OPERATOR); -			} -		} -	} - -	if (setWord.Contains(sc.chPrev)) { -		char s[100]; -		sc.GetCurrent(s, sizeof(s)); -		if (keywords.InList(s)) { -			sc.ChangeState(SCE_LUA_WORD); -		} else if (keywords2.InList(s)) { -			sc.ChangeState(SCE_LUA_WORD2); -		} else if (keywords3.InList(s)) { -			sc.ChangeState(SCE_LUA_WORD3); -		} else if (keywords4.InList(s)) { -			sc.ChangeState(SCE_LUA_WORD4); -		} else if (keywords5.InList(s)) { -			sc.ChangeState(SCE_LUA_WORD5); -		} else if (keywords6.InList(s)) { -			sc.ChangeState(SCE_LUA_WORD6); -		} else if (keywords7.InList(s)) { -			sc.ChangeState(SCE_LUA_WORD7); -		} else if (keywords8.InList(s)) { -			sc.ChangeState(SCE_LUA_WORD8); -		} -	} - -	sc.Complete(); -} - -static void FoldLuaDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[], -                       Accessor &styler) { -	unsigned int lengthDoc = startPos + length; -	int visibleChars = 0; -	int lineCurrent = styler.GetLine(startPos); -	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; -	int levelCurrent = levelPrev; -	char chNext = styler[startPos]; -	bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; -	int styleNext = styler.StyleAt(startPos); -	char s[10]; - -	for (unsigned int i = startPos; i < lengthDoc; i++) { -		char ch = chNext; -		chNext = styler.SafeGetCharAt(i + 1); -		int style = styleNext; -		styleNext = styler.StyleAt(i + 1); -		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); -		if (style == SCE_LUA_WORD) { -			if (ch == 'i' || ch == 'd' || ch == 'f' || ch == 'e' || ch == 'r' || ch == 'u') { -				for (unsigned int j = 0; j < 8; j++) { -					if (!iswordchar(styler[i + j])) { -						break; -					} -					s[j] = styler[i + j]; -					s[j + 1] = '\0'; -				} - -				if ((strcmp(s, "if") == 0) || (strcmp(s, "do") == 0) || (strcmp(s, "function") == 0) || (strcmp(s, "repeat") == 0)) { -					levelCurrent++; -				} -				if ((strcmp(s, "end") == 0) || (strcmp(s, "elseif") == 0) || (strcmp(s, "until") == 0)) { -					levelCurrent--; -				} -			} -		} else if (style == SCE_LUA_OPERATOR) { -			if (ch == '{' || ch == '(') { -				levelCurrent++; -			} else if (ch == '}' || ch == ')') { -				levelCurrent--; -			} -		} else if (style == SCE_LUA_LITERALSTRING || style == SCE_LUA_COMMENT) { -			if (ch == '[') { -				levelCurrent++; -			} else if (ch == ']') { -				levelCurrent--; -			} -		} - -		if (atEOL) { -			int lev = levelPrev; -			if (visibleChars == 0 && foldCompact) { -				lev |= SC_FOLDLEVELWHITEFLAG; -			} -			if ((levelCurrent > levelPrev) && (visibleChars > 0)) { -				lev |= SC_FOLDLEVELHEADERFLAG; -			} -			if (lev != styler.LevelAt(lineCurrent)) { -				styler.SetLevel(lineCurrent, lev); -			} -			lineCurrent++; -			levelPrev = levelCurrent; -			visibleChars = 0; -		} -		if (!isspacechar(ch)) { -			visibleChars++; -		} -	} -	// Fill in the real level of the next line, keeping the current flags as they will be filled in later - -	int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; -	styler.SetLevel(lineCurrent, levelPrev | flagsNext); -} - -static const char * const luaWordListDesc[] = { -	"Keywords", -	"Basic functions", -	"String, (table) & math functions", -	"(coroutines), I/O & system facilities", -	"user1", -	"user2", -	"user3", -	"user4", -	0 -}; - -LexerModule lmLua(SCLEX_LUA, ColouriseLuaDoc, "lua", FoldLuaDoc, luaWordListDesc); | 
