diff options
| author | nyamatongwe <unknown> | 2003-10-08 11:53:53 +0000 | 
|---|---|---|
| committer | nyamatongwe <unknown> | 2003-10-08 11:53:53 +0000 | 
| commit | 6db67cd726c63ffb87ff22b99b5e7f2c5e32008d (patch) | |
| tree | 4da32ded00f15f9e42e9eae07452ef849bba05be /src/LexAsm.cxx | |
| parent | 1aa48faef5e6076520ec3ebef0b67465f8257bcc (diff) | |
| download | scintilla-mirror-6db67cd726c63ffb87ff22b99b5e7f2c5e32008d.tar.gz | |
Enhancements to Asm lexer by Kein-Hong Man.
Diffstat (limited to 'src/LexAsm.cxx')
| -rw-r--r-- | src/LexAsm.cxx | 103 | 
1 files changed, 69 insertions, 34 deletions
| diff --git a/src/LexAsm.cxx b/src/LexAsm.cxx index 1eecf9b31..93e0b3718 100644 --- a/src/LexAsm.cxx +++ b/src/LexAsm.cxx @@ -1,9 +1,11 @@  // Scintilla source code edit control  /** @file LexAsm.cxx - ** Lexer for Assembler, just for the Masm Syntax + ** Lexer for Assembler, just for the MASM syntax   ** Written by The Black Horus + ** Enhancements and NASM stuff by Kein-Hong Man, 2003-10 + ** SCE_ASM_COMMENTBLOCK and SCE_ASM_CHARACTER are for future GNU as colouring   **/ -// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org> +// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>  // The License.txt file describes the conditions under which this software may be distributed.  #include <stdlib.h> @@ -22,24 +24,25 @@  #include "SciLexer.h" -  static inline bool IsAWordChar(const int ch) { -	return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch =='\\'); +	return (ch < 0x80) && (isalnum(ch) || ch == '.' || +		ch == '_' || ch == '?');  }  static inline bool IsAWordStart(const int ch) { -	return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.'); +	return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' || +		ch == '%' || ch == '@' || ch == '$' || ch == '?');  } -inline bool isAsmOperator(char ch) { +static inline bool IsAsmOperator(char ch) {  	if (isalnum(ch))  		return false;  	// '.' 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 == '^' || +		ch == '[' || ch == ']' || ch == '<' || ch == '&' || +		ch == '>' || ch == ',' || ch == '|' || ch == '~' || +		ch == '%' || ch == ':')  		return true;  	return false;  } @@ -52,48 +55,63 @@ static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, Wo  	WordList ®isters = *keywordlists[2];  	WordList &directive = *keywordlists[3];  	WordList &directiveOperand = *keywordlists[4]; +	WordList &extInstruction = *keywordlists[5]; + +	// Do not leak onto next line +	if (initStyle == SCE_ASM_STRINGEOL) +		initStyle = SCE_ASM_DEFAULT;  	StyleContext sc(startPos, length, initStyle, styler);  	for (; sc.More(); sc.Forward())  	{ + +		// Prevent SCE_ASM_STRINGEOL from leaking back to previous line +		if (sc.atLineStart && (sc.state == SCE_ASM_STRING)) { +			sc.SetState(SCE_ASM_STRING); +		} else if (sc.atLineStart && (sc.state == SCE_ASM_CHARACTER)) { +			sc.SetState(SCE_ASM_CHARACTER); +		} +  		// Handle line continuation generically.  		if (sc.ch == '\\') { -			if (sc.Match("\\\n")) { -				sc.Forward(); -				continue; -			} -			if (sc.Match("\\\r\n")) { -				sc.Forward(); +			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_ASM_OPERATOR) { -			sc.SetState(SCE_ASM_DEFAULT); +			if (!IsAsmOperator(static_cast<char>(sc.ch))) { +			    sc.SetState(SCE_ASM_DEFAULT); +			}  		}else if (sc.state == SCE_ASM_NUMBER) {  			if (!IsAWordChar(sc.ch)) {  				sc.SetState(SCE_ASM_DEFAULT);  			}  		} else if (sc.state == SCE_ASM_IDENTIFIER) {  			if (!IsAWordChar(sc.ch) ) { -			char s[100]; -			sc.GetCurrentLowered(s, sizeof(s)); - -			if (cpuInstruction.InList(s)) { -				sc.ChangeState(SCE_ASM_CPUINSTRUCTION); -			} else if (mathInstruction.InList(s)) { -				sc.ChangeState(SCE_ASM_MATHINSTRUCTION); -			} else if (registers.InList(s)) { -				sc.ChangeState(SCE_ASM_REGISTER); -			}  else if (directive.InList(s)) { -				sc.ChangeState(SCE_ASM_DIRECTIVE); -			} else if (directiveOperand.InList(s)) { -				sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND); -			} -			sc.SetState(SCE_ASM_DEFAULT); +				char s[100]; +				sc.GetCurrentLowered(s, sizeof(s)); + +				if (cpuInstruction.InList(s)) { +					sc.ChangeState(SCE_ASM_CPUINSTRUCTION); +				} else if (mathInstruction.InList(s)) { +					sc.ChangeState(SCE_ASM_MATHINSTRUCTION); +				} else if (registers.InList(s)) { +					sc.ChangeState(SCE_ASM_REGISTER); +				}  else if (directive.InList(s)) { +					sc.ChangeState(SCE_ASM_DIRECTIVE); +				} else if (directiveOperand.InList(s)) { +					sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND); +				} else if (extInstruction.InList(s)) { +					sc.ChangeState(SCE_ASM_EXTINSTRUCTION); +				} +				sc.SetState(SCE_ASM_DEFAULT);  			}  		}  		else if (sc.state == SCE_ASM_COMMENT ) { @@ -108,20 +126,36 @@ static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, Wo  			} else if (sc.ch == '\"') {  				sc.ForwardSetState(SCE_ASM_DEFAULT);  			} else if (sc.atLineEnd) { +				sc.ChangeState(SCE_ASM_STRINGEOL); +				sc.ForwardSetState(SCE_ASM_DEFAULT); +			} +		} else if (sc.state == SCE_ASM_CHARACTER) { +			if (sc.ch == '\\') { +				if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { +					sc.Forward(); +				} +			} else if (sc.ch == '\'') { +				sc.ForwardSetState(SCE_ASM_DEFAULT); +			} else if (sc.atLineEnd) { +				sc.ChangeState(SCE_ASM_STRINGEOL);  				sc.ForwardSetState(SCE_ASM_DEFAULT);  			}  		}  		// Determine if a new state should be entered. -		else if (sc.state == SCE_ASM_DEFAULT) { +		if (sc.state == SCE_ASM_DEFAULT) {  			if (sc.ch == ';'){  				sc.SetState(SCE_ASM_COMMENT);  			} else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {  				sc.SetState(SCE_ASM_NUMBER);  			} else if (IsAWordStart(sc.ch)) {  				sc.SetState(SCE_ASM_IDENTIFIER); -			} else if (sc.Match('\"')) { +			} else if (sc.ch == '\"') {  				sc.SetState(SCE_ASM_STRING); +			} else if (sc.ch == '\'') { +				sc.SetState(SCE_ASM_CHARACTER); +			} else if (IsAsmOperator(static_cast<char>(sc.ch))) { +				sc.SetState(SCE_ASM_OPERATOR);  			}  		} @@ -135,6 +169,7 @@ static const char * const asmWordListDesc[] = {  	"Registers",  	"Directives",  	"Directive operands", +	"Extended instructions",  	0  }; | 
