diff options
author | nyamatongwe <devnull@localhost> | 2007-06-30 00:38:34 +0000 |
---|---|---|
committer | nyamatongwe <devnull@localhost> | 2007-06-30 00:38:34 +0000 |
commit | d7c89974c88f6994d4c7cbdedada6c6f2e24a6dd (patch) | |
tree | f44eb5dbaa3543243ad958b915b7aa4fb12efb9b /src | |
parent | ae736d0c40e4d3688787bb4e9691096eb07d0965 (diff) | |
download | scintilla-mirror-d7c89974c88f6994d4c7cbdedada6c6f2e24a6dd.tar.gz |
Support for Abaqus language added by Sergio Lucato.
Diffstat (limited to 'src')
-rw-r--r-- | src/KeyWords.cxx | 1 | ||||
-rw-r--r-- | src/LexAbaqus.cxx | 260 |
2 files changed, 261 insertions, 0 deletions
diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 9921c4ccb..6eb217104 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -141,6 +141,7 @@ int Scintilla_LinkLexers() { //++Autogenerated -- run src/LexGen.py to regenerate //**\(\tLINK_LEXER(\*);\n\) + LINK_LEXER(lmAbaqus); LINK_LEXER(lmAda); LINK_LEXER(lmAns1); LINK_LEXER(lmAPDL); diff --git a/src/LexAbaqus.cxx b/src/LexAbaqus.cxx new file mode 100644 index 000000000..194b84c51 --- /dev/null +++ b/src/LexAbaqus.cxx @@ -0,0 +1,260 @@ +// Scintilla source code edit control +/** @file LexABAQUS.cxx + ** Lexer for ABAQUS. Based on the lexer for APDL by Hadar Raz. + ** By Sergio Lucato. + **/ +// The License.txt file describes the conditions under which this software may be distributed. + +// Code folding copyied and modified from LexBasic.cxx + +#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" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80 && (isalnum(ch) || ch == '_')); +} + +static inline bool IsAnOperator(char ch) { + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || ch == '^' || + ch == '[' || ch == ']' || ch == '<' || ch == '&' || + ch == '>' || ch == ',' || ch == '|' || ch == '~' || + ch == '$' || ch == ':' || ch == '%') + return true; + return false; +} + +static void ColouriseABAQUSDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + int stringStart = ' '; + + WordList &processors = *keywordlists[0]; + WordList &commands = *keywordlists[1]; + WordList &slashcommands = *keywordlists[2]; + WordList &starcommands = *keywordlists[3]; + WordList &arguments = *keywordlists[4]; + WordList &functions = *keywordlists[5]; + + // Do not leak onto next line + initStyle = SCE_ABAQUS_DEFAULT; + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + // Determine if the current state should terminate. + if (sc.state == SCE_ABAQUS_NUMBER) { + if (!(IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') || + ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) { + sc.SetState(SCE_ABAQUS_DEFAULT); + } + } else if (sc.state == SCE_ABAQUS_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_ABAQUS_DEFAULT); + } + } else if (sc.state == SCE_ABAQUS_COMMENTBLOCK) { + if (sc.atLineEnd) { + if (sc.ch == '\r') { + sc.Forward(); + } + sc.ForwardSetState(SCE_ABAQUS_DEFAULT); + } + } else if (sc.state == SCE_ABAQUS_STRING) { + if (sc.atLineEnd) { + sc.SetState(SCE_ABAQUS_DEFAULT); + } else if ((sc.ch == '\'' && stringStart == '\'') || (sc.ch == '\"' && stringStart == '\"')) { + sc.ForwardSetState(SCE_ABAQUS_DEFAULT); + } + } else if (sc.state == SCE_ABAQUS_WORD) { + if (!IsAWordChar(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (processors.InList(s)) { + sc.ChangeState(SCE_ABAQUS_PROCESSOR); + } else if (slashcommands.InList(s)) { + sc.ChangeState(SCE_ABAQUS_SLASHCOMMAND); + } else if (starcommands.InList(s)) { + sc.ChangeState(SCE_ABAQUS_STARCOMMAND); + } else if (commands.InList(s)) { + sc.ChangeState(SCE_ABAQUS_COMMAND); + } else if (arguments.InList(s)) { + sc.ChangeState(SCE_ABAQUS_ARGUMENT); + } else if (functions.InList(s)) { + sc.ChangeState(SCE_ABAQUS_FUNCTION); + } + sc.SetState(SCE_ABAQUS_DEFAULT); + } + } else if (sc.state == SCE_ABAQUS_OPERATOR) { + if (!IsAnOperator(static_cast<char>(sc.ch))) { + sc.SetState(SCE_ABAQUS_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_ABAQUS_DEFAULT) { + if (sc.ch == '*' && sc.chNext == '*') { + sc.SetState(SCE_ABAQUS_COMMENTBLOCK); + } else if (sc.ch == '!') { + sc.SetState(SCE_ABAQUS_COMMENT); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_ABAQUS_NUMBER); + } else if (sc.ch == '\'' || sc.ch == '\"') { + sc.SetState(SCE_ABAQUS_STRING); + stringStart = sc.ch; + } else if (IsAWordChar(sc.ch) || ((sc.ch == '*' || sc.ch == '/') && !isgraph(sc.chPrev))) { + sc.SetState(SCE_ABAQUS_WORD); + } else if (IsAnOperator(static_cast<char>(sc.ch))) { + sc.SetState(SCE_ABAQUS_OPERATOR); + } + } + } + sc.Complete(); +} + +//------------------------------------------------------------------------------ +// This copyied and modified from LexBasic.cxx +//------------------------------------------------------------------------------ + +/* Bits: + * 1 - whitespace + * 2 - operator + * 4 - identifier + * 8 - decimal digit + * 16 - hex digit + * 32 - bin digit + */ +static int character_classification[128] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 10, 6, + 60, 60, 28, 28, 28, 28, 28, 28, 28, 28, 2, 2, 2, 2, 2, 2, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 4, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0 +}; + +static bool IsSpace(int c) { + return c < 128 && (character_classification[c] & 1); +} + +static bool IsIdentifier(int c) { + return c < 128 && (character_classification[c] & 4); +} + +static int LowerCase(int c) +{ + if (c >= 'A' && c <= 'Z') + return 'a' + c - 'A'; + return c; +} + +static int CheckABAQUSFoldPoint(char const *token, int &level) { + if (!strcmp(token, "*step") || + !strcmp(token, "*part") || + !strcmp(token, "*instance") || + !strcmp(token, "*assembly") || + !strcmp(token, "***region") ) { + level |= SC_FOLDLEVELHEADERFLAG; + return 1; + } + if (!strcmp(token, "*end step") || + !strcmp(token, "*end part") || + !strcmp(token, "*end instance") || + !strcmp(token, "*end assembly") || + !strcmp(token, "***end region") ) { + return -1; + } + return 0; +} + +static void FoldABAQUSDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + + int line = styler.GetLine(startPos); + int level = styler.LevelAt(line); + int go = 0, done = 0; + int endPos = startPos + length; + char word[256]; + int wordlen = 0; + int i; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + // Scan for tokens at the start of the line (they may include + // whitespace, for tokens like "End Function" + for (i = startPos; i < endPos; i++) { + int c = styler.SafeGetCharAt(i); + if (!done && !go) { + if (wordlen) { // are we scanning a token already? + word[wordlen] = static_cast<char>(LowerCase(c)); + if (!IsIdentifier(c)) { // done with token + word[wordlen] = '\0'; + go = CheckABAQUSFoldPoint(word, level); + if (!go) { + // Treat any whitespace as single blank, for + // things like "End Function". + if (IsSpace(c) && IsIdentifier(word[wordlen - 1])) { + word[wordlen] = ' '; + if (wordlen < 255) + wordlen++; + } + else // done with this line + done = 1; + } + } else if (wordlen < 255) { + wordlen++; + } + } else { // start scanning at first non-whitespace character + if (!IsSpace(c)) { + if (IsIdentifier(c)) { + word[0] = static_cast<char>(LowerCase(c)); + wordlen = 1; + } else // done with this line + done = 1; + } + } + } + if (c == '\n') { // line end + if (!done && wordlen == 0 && foldCompact) // line was only space + level |= SC_FOLDLEVELWHITEFLAG; + if (level != styler.LevelAt(line)) + styler.SetLevel(line, level); + level += go; + line++; + // reset state + wordlen = 0; + level &= ~SC_FOLDLEVELHEADERFLAG; + level &= ~SC_FOLDLEVELWHITEFLAG; + go = 0; + done = 0; + } + } +} + +static const char * const abaqusWordListDesc[] = { + "processors", + "commands", + "slashommands", + "starcommands", + "arguments", + "functions", + 0 +}; + +LexerModule lmAbaqus(SCLEX_ABAQUS, ColouriseABAQUSDoc, "abaqus", FoldABAQUSDoc, abaqusWordListDesc); |