Started working on macro support. Macro-Definition are now plain, unparsed lines. Added Syntax-Highlighter options.

This commit is contained in:
2021-07-27 12:42:26 +02:00
parent f006199201
commit 6e683eb6a0
22 changed files with 1117 additions and 462 deletions
@@ -0,0 +1,66 @@
package de.platon42.intellij.plugins.m68k.parser
import de.platon42.intellij.jupiter.MyTestCase
import de.platon42.intellij.jupiter.ParsingTestExtension
import de.platon42.intellij.jupiter.TestDataSubPath
import org.junit.jupiter.api.Test
@TestDataSubPath("macros")
internal class MacroDefinitionTest : AbstractParsingTest() {
@Test
internal fun macro_with_name_left(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(
testCase, """
FOOBAR MACRO ; start of macro
.loop\@ move.l \1,(\2)+ ; just copy all the stuff
dbra \3,.loop\@
ENDM ; end of macro
move.w d0,d1
"""
)
}
@Test
internal fun macro_with_name_right(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(
testCase, """
MACRO FOOBAR ; start of macro
.loop\@ move.l \1,(\2)+ ; just copy all the stuff
dbra \3,.loop\@
ENDM ; end of macro
label: move.w d0,d1
"""
)
}
@Test
internal fun empty_macro(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(
testCase, """
MACRO FOOBAR
ENDM
NARF = 100
"""
)
}
@Test
internal fun two_macro_definitions_in_succession(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(
testCase, """
MACRO FOOBAR1
.loop\@ move.l \1,(\2)+
dbra \3,.loop\@
ENDM
MACRO FOOBAR2
.loop\@ move.w \1,(\2)+
dbra \3,.loop\@
ENDM
label: move.w d0,d1
"""
)
}
}
@@ -0,0 +1,21 @@
Assembly File: a.asm
PsiWhiteSpace('\n')
PsiWhiteSpace(' ')
M68kMacroDefinitionImpl(MACRO_DEFINITION)
PsiElement(M68kTokenType.MACRO_TAG)('MACRO')
PsiWhiteSpace(' ')
M68kMacroNameDefinitionImpl(MACRO_NAME_DEFINITION)
PsiElement(M68kTokenType.MACRO_NAME)('FOOBAR')
PsiWhiteSpace('\n')
PsiElement(M68kTokenType.MACRO_END_TAG)(' ENDM')
PsiElement(M68kTokenType.EOL)('\n')
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
M68kSymbolDefinitionImpl(SYMBOL_DEFINITION)
PsiElement(M68kTokenType.SYMBOLDEF)('NARF')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('100')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,37 @@
Assembly File: a.asm
PsiWhiteSpace('\n')
M68kMacroDefinitionImpl(MACRO_DEFINITION)
M68kMacroNameDefinitionImpl(MACRO_NAME_DEFINITION)
PsiElement(M68kTokenType.MACRO_NAME)('FOOBAR')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.MACRO_TAG)('MACRO')
PsiWhiteSpace(' ')
PsiComment(M68kTokenType.COMMENT)('; start of macro')
PsiWhiteSpace('\n')
M68kMacroPlainLineImpl(MACRO_PLAIN_LINE)
PsiElement(M68kTokenType.MACRO_LINE)('.loop\@ move.l \1,(\2)+ ')
PsiComment(M68kTokenType.COMMENT)('; just copy all the stuff')
PsiWhiteSpace('\n')
M68kMacroPlainLineImpl(MACRO_PLAIN_LINE)
PsiElement(M68kTokenType.MACRO_LINE)(' dbra \3,.loop\@')
PsiWhiteSpace('\n')
PsiElement(M68kTokenType.MACRO_END_TAG)(' ENDM ')
PsiComment(M68kTokenType.COMMENT)('; end of macro')
PsiElement(M68kTokenType.EOL)('\n')
PsiWhiteSpace('\n')
PsiWhiteSpace(' ')
M68kStatementImpl(STATEMENT)
M68kAsmInstructionImpl(ASM_INSTRUCTION)
M68kAsmOpImpl(ASM_OP)
PsiElement(M68kTokenType.MNEMONIC)('move')
M68kOperandSizeImpl(OPERAND_SIZE)
PsiElement(M68kTokenType.OPSIZE_W)('.w')
PsiWhiteSpace(' ')
M68kDataRegisterDirectAddressingModeImpl(DATA_REGISTER_DIRECT_ADDRESSING_MODE)
M68kDataRegisterImpl(DATA_REGISTER)
PsiElement(M68kTokenType.DREG)('d0')
PsiElement(M68kTokenType.SEPARATOR)(',')
M68kDataRegisterDirectAddressingModeImpl(DATA_REGISTER_DIRECT_ADDRESSING_MODE)
M68kDataRegisterImpl(DATA_REGISTER)
PsiElement(M68kTokenType.DREG)('d1')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,40 @@
Assembly File: a.asm
PsiWhiteSpace('\n')
PsiWhiteSpace(' ')
M68kMacroDefinitionImpl(MACRO_DEFINITION)
PsiElement(M68kTokenType.MACRO_TAG)('MACRO')
PsiWhiteSpace(' ')
M68kMacroNameDefinitionImpl(MACRO_NAME_DEFINITION)
PsiElement(M68kTokenType.MACRO_NAME)('FOOBAR')
PsiWhiteSpace(' ')
PsiComment(M68kTokenType.COMMENT)('; start of macro')
PsiWhiteSpace('\n')
M68kMacroPlainLineImpl(MACRO_PLAIN_LINE)
PsiElement(M68kTokenType.MACRO_LINE)('.loop\@ move.l \1,(\2)+ ')
PsiComment(M68kTokenType.COMMENT)('; just copy all the stuff')
PsiWhiteSpace('\n')
M68kMacroPlainLineImpl(MACRO_PLAIN_LINE)
PsiElement(M68kTokenType.MACRO_LINE)(' dbra \3,.loop\@')
PsiWhiteSpace('\n')
PsiElement(M68kTokenType.MACRO_END_TAG)(' ENDM ')
PsiComment(M68kTokenType.COMMENT)('; end of macro')
PsiElement(M68kTokenType.EOL)('\n')
M68kStatementImpl(STATEMENT)
M68kGlobalLabelImpl(GLOBAL_LABEL)
PsiElement(M68kTokenType.GLOBAL_LABEL_DEF)('label')
PsiElement(M68kTokenType.COLON)(':')
PsiWhiteSpace(' ')
M68kAsmInstructionImpl(ASM_INSTRUCTION)
M68kAsmOpImpl(ASM_OP)
PsiElement(M68kTokenType.MNEMONIC)('move')
M68kOperandSizeImpl(OPERAND_SIZE)
PsiElement(M68kTokenType.OPSIZE_W)('.w')
PsiWhiteSpace(' ')
M68kDataRegisterDirectAddressingModeImpl(DATA_REGISTER_DIRECT_ADDRESSING_MODE)
M68kDataRegisterImpl(DATA_REGISTER)
PsiElement(M68kTokenType.DREG)('d0')
PsiElement(M68kTokenType.SEPARATOR)(',')
M68kDataRegisterDirectAddressingModeImpl(DATA_REGISTER_DIRECT_ADDRESSING_MODE)
M68kDataRegisterImpl(DATA_REGISTER)
PsiElement(M68kTokenType.DREG)('d1')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,51 @@
Assembly File: a.asm
PsiWhiteSpace('\n')
PsiWhiteSpace(' ')
M68kMacroDefinitionImpl(MACRO_DEFINITION)
PsiElement(M68kTokenType.MACRO_TAG)('MACRO')
PsiWhiteSpace(' ')
M68kMacroNameDefinitionImpl(MACRO_NAME_DEFINITION)
PsiElement(M68kTokenType.MACRO_NAME)('FOOBAR1')
PsiWhiteSpace('\n')
M68kMacroPlainLineImpl(MACRO_PLAIN_LINE)
PsiElement(M68kTokenType.MACRO_LINE)('.loop\@ move.l \1,(\2)+')
PsiWhiteSpace('\n')
M68kMacroPlainLineImpl(MACRO_PLAIN_LINE)
PsiElement(M68kTokenType.MACRO_LINE)(' dbra \3,.loop\@')
PsiWhiteSpace('\n')
PsiElement(M68kTokenType.MACRO_END_TAG)(' ENDM')
PsiElement(M68kTokenType.EOL)('\n')
PsiWhiteSpace(' ')
M68kMacroDefinitionImpl(MACRO_DEFINITION)
PsiElement(M68kTokenType.MACRO_TAG)('MACRO')
PsiWhiteSpace(' ')
M68kMacroNameDefinitionImpl(MACRO_NAME_DEFINITION)
PsiElement(M68kTokenType.MACRO_NAME)('FOOBAR2')
PsiWhiteSpace('\n')
M68kMacroPlainLineImpl(MACRO_PLAIN_LINE)
PsiElement(M68kTokenType.MACRO_LINE)('.loop\@ move.w \1,(\2)+')
PsiWhiteSpace('\n')
M68kMacroPlainLineImpl(MACRO_PLAIN_LINE)
PsiElement(M68kTokenType.MACRO_LINE)(' dbra \3,.loop\@')
PsiWhiteSpace('\n')
PsiElement(M68kTokenType.MACRO_END_TAG)(' ENDM')
PsiElement(M68kTokenType.EOL)('\n')
M68kStatementImpl(STATEMENT)
M68kGlobalLabelImpl(GLOBAL_LABEL)
PsiElement(M68kTokenType.GLOBAL_LABEL_DEF)('label')
PsiElement(M68kTokenType.COLON)(':')
PsiWhiteSpace(' ')
M68kAsmInstructionImpl(ASM_INSTRUCTION)
M68kAsmOpImpl(ASM_OP)
PsiElement(M68kTokenType.MNEMONIC)('move')
M68kOperandSizeImpl(OPERAND_SIZE)
PsiElement(M68kTokenType.OPSIZE_W)('.w')
PsiWhiteSpace(' ')
M68kDataRegisterDirectAddressingModeImpl(DATA_REGISTER_DIRECT_ADDRESSING_MODE)
M68kDataRegisterImpl(DATA_REGISTER)
PsiElement(M68kTokenType.DREG)('d0')
PsiElement(M68kTokenType.SEPARATOR)(',')
M68kDataRegisterDirectAddressingModeImpl(DATA_REGISTER_DIRECT_ADDRESSING_MODE)
M68kDataRegisterImpl(DATA_REGISTER)
PsiElement(M68kTokenType.DREG)('d1')
PsiElement(M68kTokenType.EOL)('\n')