Kaydet (Commit) 62a10a56 authored tarafından Enrico Tröger's avatar Enrico Tröger

added new file Assembler


git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@34 ea778897-0a13-0410-b9d1-a72fbfd435f5
üst 41457647
[styling]
# foreground;background;bold
default=0x000000,0xffffff,false
comment=0x808080,0xffffff,false
number=0x007f00,0xffffff,false
string=0x1e90ff,0xffffff,false
operator=0x000000,0xffffff,false
identifier=0x000088,0xffffff,false
cpuinstruction=0x991111,0xffffff,true
mathinstruction=0x00007f,0xffffff,true
register=0x000000,0xffffff,true
directive=0x0F673D,0xffffff,true
directiveoperand=0x1e90ff,0xffffff,false;
commentblock=0x808080,0xffffff,false
character=0x1e90ff,0xffffff,false
stringeol=0x000000,0xe0c0e0,false
extinstruction=0x7f7f00,0xffffff,false
[keywords]
# all items must be in one line
# this is by default a very simple instruction set, not of Intel or so
instructions=hlt lad spi add sub mul div jmp jez jgz jlz swap jsr ret pushac popac addst subst mulst divst lsa lds push pop cli ldi ink lia dek ldx
registers=
directives=org list nolist page equivalent word text
......@@ -129,6 +129,7 @@ int Scintilla_LinkLexers() {
//++Autogenerated -- run src/LexGen.py to regenerate
//**\(\tLINK_LEXER(\*);\n\)
LINK_LEXER(lmAsm);
LINK_LEXER(lmBash);
LINK_LEXER(lmPython);
LINK_LEXER(lmBatch);
......
// Scintilla source code edit control
/** @file LexAsm.cxx
** 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-2003 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#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 inline bool IsAWordChar(const int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '.' ||
ch == '_' || ch == '?');
}
static inline bool IsAWordStart(const int ch) {
//ch == '$' ||
return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' ||
ch == '%' || ch == '$' || 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 == ':')
return true;
return false;
}
static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
Accessor &styler) {
WordList &cpuInstruction = *keywordlists[0];
WordList &mathInstruction = *keywordlists[1];
WordList &registers = *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.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) {
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));
//printf("-%s--", 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 ) {
if (sc.atLineEnd) {
sc.SetState(SCE_ASM_DEFAULT);
}
} else if (sc.state == SCE_ASM_STRING) {
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);
}
} 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.
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.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);
}
}
}
sc.Complete();
}
static const char * const asmWordListDesc[] = {
"CPU instructions",
"FPU instructions",
"Registers",
"Directives",
"Directive operands",
"Extended instructions",
0
};
LexerModule lmAsm(SCLEX_ASM, ColouriseAsmDoc, "asm", 0, asmWordListDesc);
......@@ -9,6 +9,7 @@ AM_CXXFLAGS = -DGTK -DGTK2 -DSCI_LEXER -DG_THREADS_IMPL_NONE
#AM_CXXFLAGS = -DGTK -DGTK2 -DSCI_LEXER
LEXER_SRCS= \
LexAsm.cxx \
LexBash.cxx \
LexCPP.cxx \
LexConf.cxx \
......
......@@ -239,6 +239,20 @@ void filetypes_init_types(void)
filetypes[GEANY_FILETYPES_CONF]->style_func_ptr = styleset_conf;
filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_CONF]->title, filetypes[GEANY_FILETYPES_CONF]);
filetypes[GEANY_FILETYPES_ASM] = (filetype*)g_malloc(sizeof(filetype));
filetypes[GEANY_FILETYPES_ASM]->id = GEANY_FILETYPES_ASM;
filetypes[GEANY_FILETYPES_ASM]->name = g_strdup("ASM");
filetypes[GEANY_FILETYPES_ASM]->has_tags = FALSE;
filetypes[GEANY_FILETYPES_ASM]->title = g_strdup(_("Assembler source file"));
filetypes[GEANY_FILETYPES_ASM]->extension = g_strdup("asm");
filetypes[GEANY_FILETYPES_ASM]->pattern[0] = g_strdup("*.asm");
filetypes[GEANY_FILETYPES_ASM]->pattern[1] = NULL;
filetypes[GEANY_FILETYPES_ASM]->pattern[2] = NULL;
filetypes[GEANY_FILETYPES_ASM]->pattern[3] = NULL;
filetypes[GEANY_FILETYPES_ASM]->pattern[4] = NULL; // always have to be NULL
filetypes[GEANY_FILETYPES_ASM]->style_func_ptr = styleset_asm;
filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_ASM]->title, filetypes[GEANY_FILETYPES_ASM]);
filetypes[GEANY_FILETYPES_ALL] = (filetype*)g_malloc(sizeof(filetype));
filetypes[GEANY_FILETYPES_ALL]->id = GEANY_FILETYPES_ALL;
filetypes[GEANY_FILETYPES_ALL]->name = g_strdup("None");
......
......@@ -43,6 +43,7 @@ enum
GEANY_FILETYPES_MAKE,
GEANY_FILETYPES_CSS,
GEANY_FILETYPES_CONF,
GEANY_FILETYPES_ASM,
GEANY_FILETYPES_ALL,
GEANY_MAX_FILE_TYPES
};
......
......@@ -1986,3 +1986,123 @@ void styleset_conf(ScintillaObject *sci)
}
void styleset_asm_init(void)
{
GKeyFile *config = g_key_file_new();
style_set_load_file(config, GEANY_DATA_DIR "/filetypes.asm", G_KEY_FILE_KEEP_COMMENTS, NULL);
types[GEANY_FILETYPES_ASM] = g_new(style_set, 1);
styleset_get_hex(config, "styling", "default", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[0]);
styleset_get_hex(config, "styling", "comment", "0x808080", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[1]);
styleset_get_hex(config, "styling", "number", "0x007f00", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[2]);
styleset_get_hex(config, "styling", "string", "0x1E90FF", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[3]);
styleset_get_hex(config, "styling", "operator", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[4]);
styleset_get_hex(config, "styling", "identifier", "0x000088", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[5]);
styleset_get_hex(config, "styling", "cpuinstruction", "0x991111", "0xffffff", "true", types[GEANY_FILETYPES_ASM]->styling[6]);
styleset_get_hex(config, "styling", "mathinstruction", "0x00007F", "0xffffff", "true", types[GEANY_FILETYPES_ASM]->styling[7]);
styleset_get_hex(config, "styling", "register", "0x100000", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[8]);
styleset_get_hex(config, "styling", "directive", "0x0F673D", "0xffffff", "true", types[GEANY_FILETYPES_ASM]->styling[9]);
styleset_get_hex(config, "styling", "directiveoperand", "0x1E90FF", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[10]);
styleset_get_hex(config, "styling", "commentblock", "0x808080", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[11]);
styleset_get_hex(config, "styling", "character", "0x1E90FF", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[12]);
styleset_get_hex(config, "styling", "stringeol", "0x000000", "0xe0c0e0", "false", types[GEANY_FILETYPES_ASM]->styling[13]);
styleset_get_hex(config, "styling", "extinstruction", "0x7F7F00", "0xffffff", "false", types[GEANY_FILETYPES_ASM]->styling[14]);
types[GEANY_FILETYPES_ASM]->keywords = g_new(gchar*, 4);
types[GEANY_FILETYPES_ASM]->keywords[0] = styleset_get_string(config, "keywords", "instructions");
if (types[GEANY_FILETYPES_ASM]->keywords[0] == NULL)
types[GEANY_FILETYPES_ASM]->keywords[0] = g_strdup("HLT LAD SPI ADD SUB MUL DIV JMP JEZ JGZ JLZ SWAP JSR RET PUSHAC POPAC ADDST SUBST MULST DIVST LSA LDS PUSH POP CLI LDI INK LIA DEK LDX");
types[GEANY_FILETYPES_ASM]->keywords[1] = styleset_get_string(config, "keywords", "registers");
if (types[GEANY_FILETYPES_ASM]->keywords[1] == NULL)
types[GEANY_FILETYPES_ASM]->keywords[1] = g_strdup("");
types[GEANY_FILETYPES_ASM]->keywords[2] = styleset_get_string(config, "keywords", "directives");
if (types[GEANY_FILETYPES_ASM]->keywords[2] == NULL)
types[GEANY_FILETYPES_ASM]->keywords[2] = g_strdup("ORG LIST NOLIST PAGE EQUIVALENT WORD TEXT");
types[GEANY_FILETYPES_ASM]->keywords[3] = NULL;
g_key_file_free(config);
}
void styleset_asm(ScintillaObject *sci)
{
if (types[GEANY_FILETYPES_ASM] == NULL) styleset_asm_init();
styleset_common(sci, 5);
SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) GEANY_WORDCHARS);
SSM(sci, SCI_AUTOCSETMAXHEIGHT, 8, 0);
SSM(sci, SCI_SETLEXER, SCLEX_ASM, 0);
SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) types[GEANY_FILETYPES_ASM]->keywords[0]);
//SSM(sci, SCI_SETKEYWORDS, 1, (sptr_t) types[GEANY_FILETYPES_ASM]->keywords[0]);
SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) types[GEANY_FILETYPES_ASM]->keywords[1]);
SSM(sci, SCI_SETKEYWORDS, 3, (sptr_t) types[GEANY_FILETYPES_ASM]->keywords[2]);
//SSM(sci, SCI_SETKEYWORDS, 5, (sptr_t) types[GEANY_FILETYPES_ASM]->keywords[0]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_DEFAULT, types[GEANY_FILETYPES_ASM]->styling[0][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_DEFAULT, types[GEANY_FILETYPES_ASM]->styling[0][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_DEFAULT, types[GEANY_FILETYPES_ASM]->styling[0][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_COMMENT, types[GEANY_FILETYPES_ASM]->styling[1][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_COMMENT, types[GEANY_FILETYPES_ASM]->styling[1][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_COMMENT, types[GEANY_FILETYPES_ASM]->styling[1][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_NUMBER, types[GEANY_FILETYPES_ASM]->styling[2][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_NUMBER, types[GEANY_FILETYPES_ASM]->styling[2][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_NUMBER, types[GEANY_FILETYPES_ASM]->styling[2][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_STRING, types[GEANY_FILETYPES_ASM]->styling[3][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_STRING, types[GEANY_FILETYPES_ASM]->styling[3][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_STRING, types[GEANY_FILETYPES_ASM]->styling[3][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_OPERATOR, types[GEANY_FILETYPES_ASM]->styling[4][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_OPERATOR, types[GEANY_FILETYPES_ASM]->styling[4][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_OPERATOR, types[GEANY_FILETYPES_ASM]->styling[4][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_IDENTIFIER, types[GEANY_FILETYPES_ASM]->styling[5][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_IDENTIFIER, types[GEANY_FILETYPES_ASM]->styling[5][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_IDENTIFIER, types[GEANY_FILETYPES_ASM]->styling[5][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_CPUINSTRUCTION, types[GEANY_FILETYPES_ASM]->styling[6][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_CPUINSTRUCTION, types[GEANY_FILETYPES_ASM]->styling[6][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_CPUINSTRUCTION, types[GEANY_FILETYPES_ASM]->styling[6][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_MATHINSTRUCTION, types[GEANY_FILETYPES_ASM]->styling[7][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_MATHINSTRUCTION, types[GEANY_FILETYPES_ASM]->styling[7][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_MATHINSTRUCTION, types[GEANY_FILETYPES_ASM]->styling[7][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_REGISTER, types[GEANY_FILETYPES_ASM]->styling[8][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_REGISTER, types[GEANY_FILETYPES_ASM]->styling[8][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_REGISTER, types[GEANY_FILETYPES_ASM]->styling[8][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_DIRECTIVE, types[GEANY_FILETYPES_ASM]->styling[9][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_DIRECTIVE, types[GEANY_FILETYPES_ASM]->styling[9][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_DIRECTIVE, types[GEANY_FILETYPES_ASM]->styling[9][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_DIRECTIVEOPERAND, types[GEANY_FILETYPES_ASM]->styling[10][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_DIRECTIVEOPERAND, types[GEANY_FILETYPES_ASM]->styling[10][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_DIRECTIVEOPERAND, types[GEANY_FILETYPES_ASM]->styling[10][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_COMMENTBLOCK, types[GEANY_FILETYPES_ASM]->styling[11][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_COMMENTBLOCK, types[GEANY_FILETYPES_ASM]->styling[11][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_COMMENTBLOCK, types[GEANY_FILETYPES_ASM]->styling[11][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_CHARACTER, types[GEANY_FILETYPES_ASM]->styling[12][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_CHARACTER, types[GEANY_FILETYPES_ASM]->styling[12][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_CHARACTER, types[GEANY_FILETYPES_ASM]->styling[12][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_STRINGEOL, types[GEANY_FILETYPES_ASM]->styling[13][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_STRINGEOL, types[GEANY_FILETYPES_ASM]->styling[13][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_STRINGEOL, types[GEANY_FILETYPES_ASM]->styling[13][2]);
SSM(sci, SCI_STYLESETFORE, SCE_ASM_EXTINSTRUCTION, types[GEANY_FILETYPES_ASM]->styling[14][0]);
SSM(sci, SCI_STYLESETBACK, SCE_ASM_EXTINSTRUCTION, types[GEANY_FILETYPES_ASM]->styling[14][1]);
SSM(sci, SCI_STYLESETBOLD, SCE_ASM_EXTINSTRUCTION, types[GEANY_FILETYPES_ASM]->styling[14][2]);
}
......@@ -64,3 +64,6 @@ void styleset_none(ScintillaObject *sci);
void styleset_css(ScintillaObject *sci);
void styleset_conf(ScintillaObject *sci);
void styleset_asm(ScintillaObject *sci);
......@@ -747,6 +747,13 @@ void sci_cb_do_comment(gint idx)
if (sel[x] == '#') continue;
sci_insert_text(doc_list[idx].sci, line_start + x, "#");
}
// use ; for Assembler, and anything else?
else if (lexer == SCLEX_ASM)
{
// skip lines which are already comments
if (sel[x] == ';') continue;
sci_insert_text(doc_list[idx].sci, line_start + x, ";");
}
// use % for LaTex
else if (lexer == SCLEX_LATEX)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment