Added first version of Syntax Highlighting. Commented out some tokens.

This commit is contained in:
2021-07-15 16:40:17 +02:00
parent 03c11ecef9
commit f482948abe
50 changed files with 881 additions and 962 deletions
@@ -6,7 +6,7 @@ import org.jetbrains.annotations.NonNls
import javax.swing.Icon
@Suppress("unused")
class M68kFileType private constructor() : LanguageFileType(M68kLanguage.INSTANCE, true) {
class M68kFileType private constructor() : LanguageFileType(M68kLanguage.INSTANCE, false) {
@NonNls
override fun getName(): String {
return "M68k Assembler"
@@ -136,14 +136,14 @@ HASH_COMMENT=([#;*].*+)
"&" { return OP_BITWISE_AND; }
"|" { return OP_BITWISE_OR; }
"^" { return OP_BITWISE_XOR; }
":" { return COLON; }
";" { return SEMICOLON; }
"[" { return SQUARE_L; }
"]" { return SQUARE_R; }
// ":" { return COLON; }
// ";" { return SEMICOLON; }
// "[" { return SQUARE_L; }
// "]" { return SQUARE_R; }
"(" { return ROUND_L; }
")" { return ROUND_R; }
"." { return DOT; }
"$" { return DOLLAR; }
// "." { return DOT; }
// "$" { return DOLLAR; }
"=" { return OP_ASSIGN; }
"!" { return OP_UNARY_NOT; }
"~" { return OP_UNARY_COMPL; }
@@ -193,16 +193,16 @@ HASH_COMMENT=([#;*].*+)
"&" { return OP_BITWISE_AND; }
"|" { return OP_BITWISE_OR; }
"^" { return OP_BITWISE_XOR; }
":" { return COLON; }
";" { return SEMICOLON; }
"[" { return SQUARE_L; }
"]" { return SQUARE_R; }
// ":" { return COLON; }
// ";" { return SEMICOLON; }
// "[" { return SQUARE_L; }
// "]" { return SQUARE_R; }
"(" { return ROUND_L; }
")" { return ROUND_R; }
"," { return SEPARATOR; }
"." { return DOT; }
// "." { return DOT; }
"#" { return HASH; }
"$" { return DOLLAR; }
// "$" { return DOLLAR; }
"=" { return OP_ASSIGN; }
"!" { return OP_UNARY_NOT; }
"~" { return OP_UNARY_COMPL; }
@@ -30,84 +30,84 @@
EOL = 'regexp:\R'
WHITE_SPACE = 'regexp:\p{Blank}+'
EQU = 'equ'
// EQU = 'equ'
//
// EVEN_TAG = 'even'
// CNOP_TAG = 'cnop'
// SECTION_TAG = 'section'
//
// INCLUDE_TAG = 'include'
// INCBIN_TAG = 'incbin'
//
// IF_TAG = 'regexp:(if\p{Alpha}*)'
// ELSE_TAG = 'else'
// ENDC_TAG = 'endc'
// MACRO_TAG = 'macro'
// MACRO_END_TAG = 'endm'
// REPT_TAG = 'rept'
// REPT_END_TAG = 'endr'
// FAIL_TAG = 'fail'
// END_TAG = 'end'
EVEN_TAG = 'even'
CNOP_TAG = 'cnop'
SECTION_TAG = 'section'
INCLUDE_TAG = 'include'
INCBIN_TAG = 'incbin'
IF_TAG = 'regexp:(if\p{Alpha}*)'
ELSE_TAG = 'else'
ENDC_TAG = 'endc'
MACRO_TAG = 'macro'
MACRO_END_TAG = 'endm'
REPT_TAG = 'rept'
REPT_END_TAG = 'endr'
FAIL_TAG = 'fail'
END_TAG = 'end'
AREG = 'regexp:((a[0-7])|sp)'
DREG = 'regexp:(d[0-7])'
PC = 'pc'
REG_CCR = 'ccr'
REG_SR = 'sr'
REG_USP = 'usp'
REG_VBR = 'vbr'
// AREG = 'regexp:((a[0-7])|sp)'
// DREG = 'regexp:(d[0-7])'
// PC = 'pc'
// REG_CCR = 'ccr'
// REG_SR = 'sr'
// REG_USP = 'usp'
// REG_VBR = 'vbr'
// ASSIGNMENT = 'regexp:((\p{Alpha}|_)(\p{Alnum}|_)*)((\p{Blank}+equ\p{Blank})|=)'
// LOCAL_LABEL_OC = 'regexp:(!(\p{Blank}+)\.(\p{Alpha}|_)(\p{Alnum}|_)*:?)|(!(\p{Blank}+)(\p{Alpha}|_)(\p{Alnum}|_)*\$:?)|((\p{Blank}*)?\.(\p{Alpha}|_)(\p{Alnum}|_)*:)|((\p{Blank}*)?(\p{Alpha}|_)(\p{Alnum}|_)*\$:)|(\.(\p{Alpha}|_)(\p{Alnum}|_)*:)|((\p{Alpha}|_)(\p{Alnum}|_)*\$:)'
// GLOBAL_LABEL_OC = 'regexp:(!(\p{Blank}+)(\p{Alpha}|_)(\p{Alnum}|_)*:?:?)|((\p{Blank}*)?(\p{Alpha}|_)(\p{Alnum}|_)*::?)'
MNEMONIC = 'regexp:((\p{Alpha})+)'
SYMBOL = 'regexp:((\p{Alpha}|_)(\p{Alnum}|_)*)'
OPSIZE_BS = 'regexp:(\.[bs])'
OPSIZE_WL = 'regexp:(\.[wl])'
// MNEMONIC = 'regexp:((\p{Alpha})+)'
// SYMBOL = 'regexp:((\p{Alpha}|_)(\p{Alnum}|_)*)'
// OPSIZE_BS = 'regexp:(\.[bs])'
// OPSIZE_WL = 'regexp:(\.[wl])'
BINARY = 'regexp:(%[01]+)'
HEXADECIMAL = 'regexp:(\$[0-9a-f]+)'
OCTAL = 'regexp:(@[0-7]+)'
DECIMAL = 'regexp:([0-9]+)'
// BINARY = 'regexp:(%[01]+)'
// HEXADECIMAL = 'regexp:(\$[0-9a-f]+)'
// OCTAL = 'regexp:(@[0-7]+)'
// DECIMAL = 'regexp:([0-9]+)'
STRINGLIT = "regexp:(`([^`\\]|\\.)*`|'([^'\\]|\\.)*'|\"([^\"\\]|\\.)*\")|<([^`\\]|\\.)*>"
// STRINGLIT = "regexp:(`([^`\\]|\\.)*`|'([^'\\]|\\.)*'|\"([^\"\\]|\\.)*\")|<([^`\\]|\\.)*>"
COLON = ':'
SEMICOLON = ';'
SQUARE_L = '['
SQUARE_R = ']'
ROUND_L = '('
ROUND_R = ')'
SEPARATOR = ','
DOT = '.'
HASH = '#'
DOLLAR = '$'
OP_ASSIGN = '='
OP_UNARY_NOT = '!'
OP_UNARY_COMPL = '~'
OP_PLUS = '+'
OP_MINUS = '-'
OP_AR_MUL = '*'
OP_AR_DIV = '/'
OP_AR_MOD = '%'
OP_AR_SHIFT_L = '<<'
OP_AR_SHIFT_R = '>>'
OP_BITWISE_AND = '&'
OP_BITWISE_OR = '|'
OP_BITWISE_XOR = '^'
OP_LOGICAL_AND = '&&'
OP_LOGICAL_OR = '||'
OP_CMP_EQ = '=='
OP_CMP_LT = '<'
OP_CMP_GT = '>'
OP_CMP_GT_EQ = '>='
OP_CMP_LT_EQ = '<='
OP_CMP_NOT_EQ = '!='
// COLON = ':'
// SEMICOLON = ';'
// SQUARE_L = '['
// SQUARE_R = ']'
// ROUND_L = '('
// ROUND_R = ')'
// SEPARATOR = ','
// DOT = '.'
// HASH = '#'
// DOLLAR = '$'
//
// OP_ASSIGN = '='
//
// OP_UNARY_NOT = '!'
// OP_UNARY_COMPL = '~'
//
// OP_PLUS = '+'
// OP_MINUS = '-'
// OP_AR_MUL = '*'
// OP_AR_DIV = '/'
// OP_AR_MOD = '%'
// OP_AR_SHIFT_L = '<<'
// OP_AR_SHIFT_R = '>>'
// OP_BITWISE_AND = '&'
// OP_BITWISE_OR = '|'
// OP_BITWISE_XOR = '^'
// OP_LOGICAL_AND = '&&'
// OP_LOGICAL_OR = '||'
//
// OP_CMP_EQ = '=='
// OP_CMP_LT = '<'
// OP_CMP_GT = '>'
// OP_CMP_GT_EQ = '>='
// OP_CMP_LT_EQ = '<='
// OP_CMP_NOT_EQ = '!='
// OP_CMP_NOT_EQ2 = '<>'
COMMENT = 'regexp:(\p{Blank}*?[;*].*+)'//|(!\s#+.*+)'
@@ -0,0 +1,93 @@
package de.platon42.intellij.plugins.m68k.syntax
import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.fileTypes.SyntaxHighlighter
import com.intellij.openapi.options.colors.AttributesDescriptor
import com.intellij.openapi.options.colors.ColorDescriptor
import com.intellij.openapi.options.colors.ColorSettingsPage
import com.intellij.openapi.util.NlsContexts.ConfigurableName
import de.platon42.intellij.plugins.m68k.M68kIcons.FILE
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.AREG
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.BAD_CHARACTER
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.COMMENT
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.DREG
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.GLOBAL_LABEL
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.KEYWORD
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.LOCAL_LABEL
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.MNEMONIC
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.NUMBER
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.PREPROCESSOR
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.SEPARATOR
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.SPECIAL_REG
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.STRING
import de.platon42.intellij.plugins.m68k.syntax.M68kSyntaxHighlighter.Companion.SYMBOL
import org.jetbrains.annotations.NonNls
import javax.swing.Icon
class M68kColorSettingsPage : ColorSettingsPage {
override fun getIcon(): Icon {
return FILE
}
override fun getHighlighter(): SyntaxHighlighter {
return M68kSyntaxHighlighter()
}
@NonNls
override fun getDemoText(): String {
return """; This is an example assembly language program
PIC_HEIGHT = 256
include "../includes/hardware/custom.i"
BLTHOGON MACRO
move.w #DMAF_SETCLR|DMAF_BLITHOG,dmacon(a5)
ENDM
demo_init ; global label
PUSHM d0-d7/a0-a6 ; this is a macro
lea pd_ModViewTable(a4),a0
moveq.l #0,d0
move.w #PIC_HEIGHT-1,d7
.loop move.l d0,(a0)+ ; local label
dbra d7,.loop
POPM
rts
"""
}
override fun getAdditionalHighlightingTagToDescriptorMap(): Map<String, TextAttributesKey>? {
return null
}
override fun getAttributeDescriptors(): Array<AttributesDescriptor> {
return DESCRIPTORS
}
override fun getColorDescriptors(): Array<ColorDescriptor> {
return ColorDescriptor.EMPTY_ARRAY
}
override fun getDisplayName(): @ConfigurableName String {
return "M68k Assembly"
}
companion object {
private val DESCRIPTORS = arrayOf(
AttributesDescriptor("SEPARATOR", SEPARATOR),
AttributesDescriptor("GLOBAL_LABEL", GLOBAL_LABEL),
AttributesDescriptor("LOCAL_LABEL", LOCAL_LABEL),
AttributesDescriptor("SYMBOL", SYMBOL),
AttributesDescriptor("MNEMONIC", MNEMONIC),
AttributesDescriptor("KEYWORD", KEYWORD),
AttributesDescriptor("PREPROCESSOR", PREPROCESSOR),
AttributesDescriptor("STRING", STRING),
AttributesDescriptor("NUMBER", NUMBER),
AttributesDescriptor("AREG", AREG),
AttributesDescriptor("DREG", DREG),
AttributesDescriptor("SPECIAL_REG", SPECIAL_REG),
AttributesDescriptor("COMMENT", COMMENT),
AttributesDescriptor("BAD_CHARACTER", BAD_CHARACTER))
}
}
@@ -0,0 +1,54 @@
package de.platon42.intellij.plugins.m68k.syntax
import com.intellij.lexer.Lexer
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
import com.intellij.openapi.editor.HighlighterColors
import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase
import com.intellij.psi.TokenType
import com.intellij.psi.tree.IElementType
import de.platon42.intellij.plugins.m68k.lexer.M68kLexer
import de.platon42.intellij.plugins.m68k.psi.M68kTypes
class M68kSyntaxHighlighter : SyntaxHighlighterBase() {
override fun getHighlightingLexer(): Lexer {
return M68kLexer()
}
override fun getTokenHighlights(tokenType: IElementType): Array<TextAttributesKey> {
return when (tokenType) {
M68kTypes.SEPARATOR -> arrayOf(SEPARATOR)
M68kTypes.GLOBAL_LABEL_DEF, M68kTypes.GLOBAL_LABEL -> arrayOf(GLOBAL_LABEL)
M68kTypes.LOCAL_LABEL_DEF, M68kTypes.LOCAL_LABEL_DEF -> arrayOf(LOCAL_LABEL)
M68kTypes.SYMBOLDEF, M68kTypes.SYMBOL -> arrayOf(SYMBOL)
M68kTypes.MNEMONIC, M68kTypes.ASM_OP -> arrayOf(MNEMONIC)
M68kTypes.OPERAND_SIZE, M68kTypes.DATA_WIDTH, M68kTypes.ADDRESS_SIZE -> arrayOf(MNEMONIC)
M68kTypes.ADDRESS_REGISTER, M68kTypes.AREG -> arrayOf(AREG)
M68kTypes.DATA_REGISTER, M68kTypes.DREG -> arrayOf(DREG)
M68kTypes.SPECIAL_REGISTER, M68kTypes.REG_USP, M68kTypes.REG_SR, M68kTypes.REG_CCR -> arrayOf(SPECIAL_REG)
M68kTypes.PREPROCESSOR_DIRECTIVE -> arrayOf(PREPROCESSOR)
M68kTypes.COMMENT -> arrayOf(COMMENT)
M68kTypes.DECIMAL, M68kTypes.HEXADECIMAL, M68kTypes.OCTAL -> arrayOf(NUMBER)
M68kTypes.STRINGLIT -> arrayOf(STRING)
TokenType.BAD_CHARACTER -> arrayOf(BAD_CHARACTER)
else -> emptyArray()
}
}
companion object {
val SEPARATOR = TextAttributesKey.createTextAttributesKey("M68K_SEPARATOR", DefaultLanguageHighlighterColors.COMMA)
val GLOBAL_LABEL = TextAttributesKey.createTextAttributesKey("M68K_LOCAL_LABEL", DefaultLanguageHighlighterColors.LOCAL_VARIABLE)
val LOCAL_LABEL = TextAttributesKey.createTextAttributesKey("M68K_GLOBAL_LABEL", DefaultLanguageHighlighterColors.GLOBAL_VARIABLE)
val SYMBOL = TextAttributesKey.createTextAttributesKey("M68K_SYMBOL", DefaultLanguageHighlighterColors.IDENTIFIER)
val MNEMONIC = TextAttributesKey.createTextAttributesKey("M68K_MNEMONIC", DefaultLanguageHighlighterColors.FUNCTION_CALL)
val KEYWORD = TextAttributesKey.createTextAttributesKey("M68K_KEYWORD", DefaultLanguageHighlighterColors.KEYWORD)
val PREPROCESSOR = TextAttributesKey.createTextAttributesKey("M68K_PREPROCESSOR", DefaultLanguageHighlighterColors.KEYWORD)
val STRING = TextAttributesKey.createTextAttributesKey("M68K_STRING", DefaultLanguageHighlighterColors.STRING)
val NUMBER = TextAttributesKey.createTextAttributesKey("M68K_NUMBER", DefaultLanguageHighlighterColors.NUMBER)
val AREG = TextAttributesKey.createTextAttributesKey("M68K_AREG", DefaultLanguageHighlighterColors.CONSTANT)
val DREG = TextAttributesKey.createTextAttributesKey("M68K_DREG", DefaultLanguageHighlighterColors.CONSTANT)
val SPECIAL_REG = TextAttributesKey.createTextAttributesKey("M68K_SPECIALREG", DefaultLanguageHighlighterColors.CONSTANT)
val COMMENT = TextAttributesKey.createTextAttributesKey("M68K_COMMENT", DefaultLanguageHighlighterColors.LINE_COMMENT)
val BAD_CHARACTER = TextAttributesKey.createTextAttributesKey("M68K_BAD_CHARACTER", HighlighterColors.BAD_CHARACTER)
}
}
@@ -0,0 +1,9 @@
package de.platon42.intellij.plugins.m68k.syntax
import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
class M68kSyntaxHighlighterFactory : SyntaxHighlighterFactory() {
override fun getSyntaxHighlighter(project: Project?, virtualFile: VirtualFile?) = M68kSyntaxHighlighter()
}