diff options
Diffstat (limited to 'lexers/LexModula.cxx')
-rw-r--r-- | lexers/LexModula.cxx | 741 |
1 files changed, 0 insertions, 741 deletions
diff --git a/lexers/LexModula.cxx b/lexers/LexModula.cxx deleted file mode 100644 index af4b8dd1b..000000000 --- a/lexers/LexModula.cxx +++ /dev/null @@ -1,741 +0,0 @@ -// -*- coding: utf-8 -*- -// Scintilla source code edit control -/** - * @file LexModula.cxx - * @author Dariusz "DKnoto" KnociĊski - * @date 2011/02/03 - * @brief Lexer for Modula-2/3 documents. - */ -// The License.txt file describes the conditions under which this software may -// be distributed. - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <stdarg.h> -#include <assert.h> -#include <ctype.h> - -#include "ILexer.h" -#include "Scintilla.h" -#include "SciLexer.h" - -#include "PropSetSimple.h" -#include "WordList.h" -#include "LexAccessor.h" -#include "Accessor.h" -#include "StyleContext.h" -#include "CharacterSet.h" -#include "LexerModule.h" - -using namespace Scintilla; - -#ifdef DEBUG_LEX_MODULA -#define DEBUG_STATE( p, c )\ - fprintf( stderr, "Unknown state: currentPos = %u, char = '%c'\n", static_cast<unsigned int>(p), c ); -#else -#define DEBUG_STATE( p, c ) -#endif - -static inline bool IsDigitOfBase( unsigned ch, unsigned base ) { - if( ch < '0' || ch > 'f' ) return false; - if( base <= 10 ) { - if( ch >= ( '0' + base ) ) return false; - } else { - if( ch > '9' ) { - unsigned nb = base - 10; - if( ( ch < 'A' ) || ( ch >= ( 'A' + nb ) ) ) { - if( ( ch < 'a' ) || ( ch >= ( 'a' + nb ) ) ) { - return false; - } - } - } - } - return true; -} - -static inline unsigned IsOperator( StyleContext & sc, WordList & op ) { - int i; - char s[3]; - - s[0] = sc.ch; - s[1] = sc.chNext; - s[2] = 0; - for( i = 0; i < op.Length(); i++ ) { - if( ( strlen( op.WordAt(i) ) == 2 ) && - ( s[0] == op.WordAt(i)[0] && s[1] == op.WordAt(i)[1] ) ) { - return 2; - } - } - s[1] = 0; - for( i = 0; i < op.Length(); i++ ) { - if( ( strlen( op.WordAt(i) ) == 1 ) && - ( s[0] == op.WordAt(i)[0] ) ) { - return 1; - } - } - return 0; -} - -static inline bool IsEOL( Accessor &styler, Sci_PositionU curPos ) { - unsigned ch = styler.SafeGetCharAt( curPos ); - if( ( ch == '\r' && styler.SafeGetCharAt( curPos + 1 ) == '\n' ) || - ( ch == '\n' ) ) { - return true; - } - return false; -} - -static inline bool checkStatement( - Accessor &styler, - Sci_Position &curPos, - const char *stt, bool spaceAfter = true ) { - int len = static_cast<int>(strlen( stt )); - int i; - for( i = 0; i < len; i++ ) { - if( styler.SafeGetCharAt( curPos + i ) != stt[i] ) { - return false; - } - } - if( spaceAfter ) { - if( ! isspace( styler.SafeGetCharAt( curPos + i ) ) ) { - return false; - } - } - curPos += ( len - 1 ); - return true; -} - -static inline bool checkEndSemicolon( - Accessor &styler, - Sci_Position &curPos, Sci_Position endPos ) -{ - const char *stt = "END"; - int len = static_cast<int>(strlen( stt )); - int i; - for( i = 0; i < len; i++ ) { - if( styler.SafeGetCharAt( curPos + i ) != stt[i] ) { - return false; - } - } - while( isspace( styler.SafeGetCharAt( curPos + i ) ) ) { - i++; - if( ( curPos + i ) >= endPos ) return false; - } - if( styler.SafeGetCharAt( curPos + i ) != ';' ) { - return false; - } - curPos += ( i - 1 ); - return true; -} - -static inline bool checkKeyIdentOper( - - Accessor &styler, - Sci_Position &curPos, Sci_Position endPos, - const char *stt, const char etk ) { - Sci_Position newPos = curPos; - if( ! checkStatement( styler, newPos, stt ) ) - return false; - newPos++; - if( newPos >= endPos ) - return false; - if( ! isspace( styler.SafeGetCharAt( newPos ) ) ) - return false; - newPos++; - if( newPos >= endPos ) - return false; - while( isspace( styler.SafeGetCharAt( newPos ) ) ) { - newPos++; - if( newPos >= endPos ) - return false; - } - if( ! isalpha( styler.SafeGetCharAt( newPos ) ) ) - return false; - newPos++; - if( newPos >= endPos ) - return false; - char ch; - ch = styler.SafeGetCharAt( newPos ); - while( isalpha( ch ) || isdigit( ch ) || ch == '_' ) { - newPos++; - if( newPos >= endPos ) return false; - ch = styler.SafeGetCharAt( newPos ); - } - while( isspace( styler.SafeGetCharAt( newPos ) ) ) { - newPos++; - if( newPos >= endPos ) return false; - } - if( styler.SafeGetCharAt( newPos ) != etk ) - return false; - curPos = newPos; - return true; -} - -static void FoldModulaDoc( Sci_PositionU startPos, - Sci_Position length, - int , WordList *[], - Accessor &styler) -{ - Sci_Position curLine = styler.GetLine(startPos); - int curLevel = SC_FOLDLEVELBASE; - Sci_Position endPos = startPos + length; - if( curLine > 0 ) - curLevel = styler.LevelAt( curLine - 1 ) >> 16; - Sci_Position curPos = startPos; - int style = styler.StyleAt( curPos ); - int visChars = 0; - int nextLevel = curLevel; - - while( curPos < endPos ) { - if( ! isspace( styler.SafeGetCharAt( curPos ) ) ) visChars++; - - switch( style ) { - case SCE_MODULA_COMMENT: - if( checkStatement( styler, curPos, "(*" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "*)" ) ) - nextLevel--; - break; - - case SCE_MODULA_DOXYCOMM: - if( checkStatement( styler, curPos, "(**", false ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "*)" ) ) - nextLevel--; - break; - - case SCE_MODULA_KEYWORD: - if( checkStatement( styler, curPos, "IF" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "BEGIN" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "TRY" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "LOOP" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "FOR" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "WHILE" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "REPEAT" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "UNTIL" ) ) - nextLevel--; - else - if( checkStatement( styler, curPos, "WITH" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "CASE" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "TYPECASE" ) ) - nextLevel++; - else - if( checkStatement( styler, curPos, "LOCK" ) ) - nextLevel++; - else - if( checkKeyIdentOper( styler, curPos, endPos, "PROCEDURE", '(' ) ) - nextLevel++; - else - if( checkKeyIdentOper( styler, curPos, endPos, "END", ';' ) ) { - Sci_Position cln = curLine; - int clv_old = curLevel; - Sci_Position pos; - char ch; - int clv_new; - while( cln > 0 ) { - clv_new = styler.LevelAt( cln - 1 ) >> 16; - if( clv_new < clv_old ) { - nextLevel--; - pos = styler.LineStart( cln ); - while( ( ch = styler.SafeGetCharAt( pos ) ) != '\n' ) { - if( ch == 'P' ) { - if( styler.StyleAt(pos) == SCE_MODULA_KEYWORD ) { - if( checkKeyIdentOper( styler, pos, endPos, - "PROCEDURE", '(' ) ) { - break; - } - } - } - pos++; - } - clv_old = clv_new; - } - cln--; - } - } - else - if( checkKeyIdentOper( styler, curPos, endPos, "END", '.' ) ) - nextLevel--; - else - if( checkEndSemicolon( styler, curPos, endPos ) ) - nextLevel--; - else { - while( styler.StyleAt( curPos + 1 ) == SCE_MODULA_KEYWORD ) - curPos++; - } - break; - - default: - break; - } - - if( IsEOL( styler, curPos ) || ( curPos == endPos - 1 ) ) { - int efectiveLevel = curLevel | nextLevel << 16; - if( visChars == 0 ) - efectiveLevel |= SC_FOLDLEVELWHITEFLAG; - if( curLevel < nextLevel ) - efectiveLevel |= SC_FOLDLEVELHEADERFLAG; - if( efectiveLevel != styler.LevelAt(curLine) ) { - styler.SetLevel(curLine, efectiveLevel ); - } - curLine++; - curLevel = nextLevel; - if( IsEOL( styler, curPos ) && ( curPos == endPos - 1 ) ) { - styler.SetLevel( curLine, ( curLevel | curLevel << 16) - | SC_FOLDLEVELWHITEFLAG); - } - visChars = 0; - } - curPos++; - style = styler.StyleAt( curPos ); - } -} - -static inline bool skipWhiteSpaces( StyleContext & sc ) { - while( isspace( sc.ch ) ) { - sc.SetState( SCE_MODULA_DEFAULT ); - if( sc.More() ) - sc.Forward(); - else - return false; - } - return true; -} - -static void ColouriseModulaDoc( Sci_PositionU startPos, - Sci_Position length, - int initStyle, - WordList *wl[], - Accessor &styler ) { - WordList& keyWords = *wl[0]; - WordList& reservedWords = *wl[1]; - WordList& operators = *wl[2]; - WordList& pragmaWords = *wl[3]; - WordList& escapeCodes = *wl[4]; - WordList& doxyKeys = *wl[5]; - - const int BUFLEN = 128; - - char buf[BUFLEN]; - int i, kl; - - Sci_Position charPos = 0; - - StyleContext sc( startPos, length, initStyle, styler ); - - while( sc.More() ) { - switch( sc.state ) { - case SCE_MODULA_DEFAULT: - if( ! skipWhiteSpaces( sc ) ) break; - - if( sc.ch == '(' && sc.chNext == '*' ) { - if( sc.GetRelative(2) == '*' ) { - sc.SetState( SCE_MODULA_DOXYCOMM ); - sc.Forward(); - } else { - sc.SetState( SCE_MODULA_COMMENT ); - } - sc.Forward(); - } - else - if( isalpha( sc.ch ) ) { - if( isupper( sc.ch ) && isupper( sc.chNext ) ) { - for( i = 0; i < BUFLEN - 1; i++ ) { - buf[i] = sc.GetRelative(i); - if( !isalpha( buf[i] ) && !(buf[i] == '_') ) - break; - } - kl = i; - buf[kl] = 0; - - if( keyWords.InList( buf ) ) { - sc.SetState( SCE_MODULA_KEYWORD ); - sc.Forward( kl ); - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } - else - if( reservedWords.InList( buf ) ) { - sc.SetState( SCE_MODULA_RESERVED ); - sc.Forward( kl ); - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } else { - /** check procedure identifier */ - } - } else { - for( i = 0; i < BUFLEN - 1; i++ ) { - buf[i] = sc.GetRelative(i); - if( !isalpha( buf[i] ) && - !isdigit( buf[i] ) && - !(buf[i] == '_') ) - break; - } - kl = i; - buf[kl] = 0; - - sc.SetState( SCE_MODULA_DEFAULT ); - sc.Forward( kl ); - continue; - } - } - else - if( isdigit( sc.ch ) ) { - sc.SetState( SCE_MODULA_NUMBER ); - continue; - } - else - if( sc.ch == '\"' ) { - sc.SetState( SCE_MODULA_STRING ); - } - else - if( sc.ch == '\'' ) { - charPos = sc.currentPos; - sc.SetState( SCE_MODULA_CHAR ); - } - else - if( sc.ch == '<' && sc.chNext == '*' ) { - sc.SetState( SCE_MODULA_PRAGMA ); - sc.Forward(); - } else { - unsigned len = IsOperator( sc, operators ); - if( len > 0 ) { - sc.SetState( SCE_MODULA_OPERATOR ); - sc.Forward( len ); - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } else { - DEBUG_STATE( sc.currentPos, sc.ch ); - } - } - break; - - case SCE_MODULA_COMMENT: - if( sc.ch == '*' && sc.chNext == ')' ) { - sc.Forward( 2 ); - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } - break; - - case SCE_MODULA_DOXYCOMM: - switch( sc.ch ) { - case '*': - if( sc.chNext == ')' ) { - sc.Forward( 2 ); - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } - break; - - case '@': - if( islower( sc.chNext ) ) { - for( i = 0; i < BUFLEN - 1; i++ ) { - buf[i] = sc.GetRelative(i+1); - if( isspace( buf[i] ) ) break; - } - buf[i] = 0; - kl = i; - - if( doxyKeys.InList( buf ) ) { - sc.SetState( SCE_MODULA_DOXYKEY ); - sc.Forward( kl + 1 ); - sc.SetState( SCE_MODULA_DOXYCOMM ); - } - } - break; - - default: - break; - } - break; - - case SCE_MODULA_NUMBER: - { - buf[0] = sc.ch; - for( i = 1; i < BUFLEN - 1; i++ ) { - buf[i] = sc.GetRelative(i); - if( ! isdigit( buf[i] ) ) - break; - } - kl = i; - buf[kl] = 0; - - switch( sc.GetRelative(kl) ) { - case '_': - { - int base = atoi( buf ); - if( base < 2 || base > 16 ) { - sc.SetState( SCE_MODULA_BADSTR ); - } else { - int imax; - - kl++; - for( i = 0; i < BUFLEN - 1; i++ ) { - buf[i] = sc.GetRelative(kl+i); - if( ! IsDigitOfBase( buf[i], 16 ) ) { - break; - } - } - imax = i; - for( i = 0; i < imax; i++ ) { - if( ! IsDigitOfBase( buf[i], base ) ) { - sc.SetState( SCE_MODULA_BADSTR ); - break; - } - } - kl += imax; - } - sc.SetState( SCE_MODULA_BASENUM ); - for( i = 0; i < kl; i++ ) { - sc.Forward(); - } - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } - break; - - case '.': - if( sc.GetRelative(kl+1) == '.' ) { - kl--; - for( i = 0; i < kl; i++ ) { - sc.Forward(); - } - sc.Forward(); - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } else { - bool doNext = false; - - kl++; - - buf[0] = sc.GetRelative(kl); - if( isdigit( buf[0] ) ) { - for( i = 0;; i++ ) { - if( !isdigit(sc.GetRelative(kl+i)) ) - break; - } - kl += i; - buf[0] = sc.GetRelative(kl); - - switch( buf[0] ) - { - case 'E': - case 'e': - case 'D': - case 'd': - case 'X': - case 'x': - kl++; - buf[0] = sc.GetRelative(kl); - if( buf[0] == '-' || buf[0] == '+' ) { - kl++; - } - buf[0] = sc.GetRelative(kl); - if( isdigit( buf[0] ) ) { - for( i = 0;; i++ ) { - if( !isdigit(sc.GetRelative(kl+i)) ) { - buf[0] = sc.GetRelative(kl+i); - break; - } - } - kl += i; - doNext = true; - } else { - sc.SetState( SCE_MODULA_BADSTR ); - } - break; - - default: - doNext = true; - break; - } - } else { - sc.SetState( SCE_MODULA_BADSTR ); - } - - if( doNext ) { - if( ! isspace( buf[0] ) && - buf[0] != ')' && - buf[0] != '>' && - buf[0] != '<' && - buf[0] != '=' && - buf[0] != '#' && - buf[0] != '+' && - buf[0] != '-' && - buf[0] != '*' && - buf[0] != '/' && - buf[0] != ',' && - buf[0] != ';' - ) { - sc.SetState( SCE_MODULA_BADSTR ); - } else { - kl--; - } - } - } - sc.SetState( SCE_MODULA_FLOAT ); - for( i = 0; i < kl; i++ ) { - sc.Forward(); - } - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - break; - - default: - for( i = 0; i < kl; i++ ) { - sc.Forward(); - } - break; - } - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } - break; - - case SCE_MODULA_STRING: - if( sc.ch == '\"' ) { - sc.Forward(); - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } else { - if( sc.ch == '\\' ) { - i = 1; - if( IsDigitOfBase( sc.chNext, 8 ) ) { - for( i = 1; i < BUFLEN - 1; i++ ) { - if( ! IsDigitOfBase(sc.GetRelative(i+1), 8 ) ) - break; - } - if( i == 3 ) { - sc.SetState( SCE_MODULA_STRSPEC ); - } else { - sc.SetState( SCE_MODULA_BADSTR ); - } - } else { - buf[0] = sc.chNext; - buf[1] = 0; - - if( escapeCodes.InList( buf ) ) { - sc.SetState( SCE_MODULA_STRSPEC ); - } else { - sc.SetState( SCE_MODULA_BADSTR ); - } - } - sc.Forward(i+1); - sc.SetState( SCE_MODULA_STRING ); - continue; - } - } - break; - - case SCE_MODULA_CHAR: - if( sc.ch == '\'' ) { - sc.Forward(); - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } - else - if( ( sc.currentPos - charPos ) == 1 ) { - if( sc.ch == '\\' ) { - i = 1; - if( IsDigitOfBase( sc.chNext, 8 ) ) { - for( i = 1; i < BUFLEN - 1; i++ ) { - if( ! IsDigitOfBase(sc.GetRelative(i+1), 8 ) ) - break; - } - if( i == 3 ) { - sc.SetState( SCE_MODULA_CHARSPEC ); - } else { - sc.SetState( SCE_MODULA_BADSTR ); - } - } else { - buf[0] = sc.chNext; - buf[1] = 0; - - if( escapeCodes.InList( buf ) ) { - sc.SetState( SCE_MODULA_CHARSPEC ); - } else { - sc.SetState( SCE_MODULA_BADSTR ); - } - } - sc.Forward(i+1); - sc.SetState( SCE_MODULA_CHAR ); - continue; - } - } else { - sc.SetState( SCE_MODULA_BADSTR ); - sc.Forward(); - sc.SetState( SCE_MODULA_CHAR ); - continue; - } - break; - - case SCE_MODULA_PRAGMA: - if( sc.ch == '*' && sc.chNext == '>' ) { - sc.Forward(); - sc.Forward(); - sc.SetState( SCE_MODULA_DEFAULT ); - continue; - } - else - if( isupper( sc.ch ) && isupper( sc.chNext ) ) { - buf[0] = sc.ch; - buf[1] = sc.chNext; - for( i = 2; i < BUFLEN - 1; i++ ) { - buf[i] = sc.GetRelative(i); - if( !isupper( buf[i] ) ) - break; - } - kl = i; - buf[kl] = 0; - if( pragmaWords.InList( buf ) ) { - sc.SetState( SCE_MODULA_PRGKEY ); - sc.Forward( kl ); - sc.SetState( SCE_MODULA_PRAGMA ); - continue; - } - } - break; - - default: - break; - } - sc.Forward(); - } - sc.Complete(); -} - -static const char *const modulaWordListDesc[] = -{ - "Keywords", - "ReservedKeywords", - "Operators", - "PragmaKeyswords", - "EscapeCodes", - "DoxygeneKeywords", - 0 -}; - -LexerModule lmModula( SCLEX_MODULA, ColouriseModulaDoc, "modula", FoldModulaDoc, - modulaWordListDesc); |