Progress on Lexer and BNF.
This commit is contained in:
@@ -9,7 +9,7 @@ import javax.swing.Icon
|
||||
class M68kFileType private constructor() : LanguageFileType(M68kLanguage.INSTANCE, true) {
|
||||
@NonNls
|
||||
override fun getName(): String {
|
||||
return "M68k"
|
||||
return "M68k Assembler"
|
||||
}
|
||||
|
||||
override fun getDescription(): String {
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
package de.platon42.intellij.plugins.m68k
|
||||
|
||||
object M68kMnemonics {
|
||||
val mnemonics =
|
||||
setOf("move", "moveq", "add", "addi", "adda", "addq", "sub", "sub", "subi", "suba", "subq", "rts", "jsr")
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
package de.platon42.intellij.plugins.m68k.asm
|
||||
|
||||
enum class Machine {
|
||||
MC68000
|
||||
}
|
||||
|
||||
data class IsaData(
|
||||
val mnemonic: String,
|
||||
val description: String,
|
||||
val machine: Machine = Machine.MC68000,
|
||||
val altMnemonics: List<String> = emptyList(),
|
||||
val conditionCodes: List<String> = emptyList()
|
||||
)
|
||||
|
||||
object M68kIsa {
|
||||
val conditionCodes =
|
||||
listOf("cc", "ls", "cs", "lt", "eq", "mi", "f", "ne", "ge", "pl", "gt", "t", "hi", "vc", "le", "vs")
|
||||
val conditionCodesBcc = conditionCodes.filterNot { it == "f" || it == "t" }
|
||||
|
||||
val isaData = listOf(
|
||||
IsaData("abcd", "Add Decimal with Extend"),
|
||||
IsaData("add", "Add"),
|
||||
IsaData("adda", "Add Address"),
|
||||
IsaData("addi", "Add Immediate"),
|
||||
IsaData("addq", "Add Quick"),
|
||||
IsaData("addx", "Add with Extend"),
|
||||
IsaData("and", "Logical AND"),
|
||||
IsaData("andi", "Logical AND Immediate"),
|
||||
IsaData("andi", "to CCR AND Immediate to Condition Code Register"),
|
||||
IsaData("andi", "to SR AND Immediate to Status Register"),
|
||||
IsaData("asl", "Arithmetic Shift Left"),
|
||||
IsaData("asr", "Arithmetic Shift Right"),
|
||||
IsaData("bCC", "Branch Conditionally", conditionCodes = conditionCodesBcc),
|
||||
IsaData("bchg", "Test Bit and Change"),
|
||||
IsaData("bclr", "Test Bit and Clear"),
|
||||
IsaData("bra", "Branch"),
|
||||
IsaData("bset", "Test Bit and Set"),
|
||||
IsaData("bsr", "Branch to Subroutine"),
|
||||
IsaData("btst", "Test Bit"),
|
||||
IsaData("chk", "Check Register Against Bound"),
|
||||
IsaData("clr", "Clear"),
|
||||
IsaData("cmp", "Compare"),
|
||||
IsaData("cmpa", "Compare Address"),
|
||||
IsaData("cmpi", "Compare Immediate"),
|
||||
IsaData("cmpm", "Compare Memory to Memory"),
|
||||
IsaData(
|
||||
"dbCC",
|
||||
"Test Condition, Decrement, and Branch",
|
||||
altMnemonics = listOf("dbra"),
|
||||
conditionCodes = conditionCodes
|
||||
),
|
||||
IsaData("divs", "Signed Divide"),
|
||||
IsaData("divu", "Unsigned Divide"),
|
||||
IsaData("eor", "Logical Exclusive-OR"),
|
||||
IsaData("eori", "Logical Exclusive-OR Immediate"),
|
||||
IsaData("eori", "to CCR Exclusive-OR Immediate to Condition Code Register"),
|
||||
IsaData("eori", "to SR Exclusive-OR Immediate to Status Register"),
|
||||
IsaData("exg", "Exchange Registers"),
|
||||
IsaData("ext", "Sign Extend"),
|
||||
IsaData("illegal", "Take Illegal Instruction Trap"),
|
||||
IsaData("jmp", "Jump"),
|
||||
IsaData("jsr", "Jump to Subroutine"),
|
||||
IsaData("lea", "Load Effective Address"),
|
||||
IsaData("link", "Link and Allocate"),
|
||||
IsaData("lsl", "Logical Shift Left"),
|
||||
IsaData("lsr", "Logical Shift Right"),
|
||||
IsaData("move", "Move"),
|
||||
IsaData("movea", "Move Address"),
|
||||
IsaData("move", "to CCR Move to Condition Code Register"),
|
||||
IsaData("move", "from SR Move from Status Register"),
|
||||
IsaData("move", "to SR Move to Status Register"),
|
||||
IsaData("move", "USP Move User Stack Pointer"),
|
||||
IsaData("movem", "Move Multiple Registers"),
|
||||
IsaData("movep", "Move Peripheral"),
|
||||
IsaData("moveq", "Move Quick"),
|
||||
IsaData("muls", "Signed Multiply"),
|
||||
IsaData("mulu", "Unsigned Multiply"),
|
||||
IsaData("nbcd", "Negate Decimal with Extend"),
|
||||
IsaData("neg", "Negate"),
|
||||
IsaData("negx", "Negate with Extend"),
|
||||
IsaData("nop", "No Operation"),
|
||||
IsaData("not", "Logical Complement"),
|
||||
IsaData("or", "Logical Inclusive-OR"),
|
||||
IsaData("ori", "Logical Inclusive-OR Immediate"),
|
||||
IsaData("ori", "to CCR Inclusive-OR Immediate to Condition Code Register"),
|
||||
IsaData("ori", "to SR Inclusive-OR Immediate to Status Register"),
|
||||
IsaData("pea", "Push Effective Address"),
|
||||
IsaData("reset", "Reset External Devices"),
|
||||
IsaData("rol", "Rotate Left"),
|
||||
IsaData("ror", "Rotate Right"),
|
||||
IsaData("roxl", "Rotate with Extend Left"),
|
||||
IsaData("roxr", "Rotate with Extend Right"),
|
||||
IsaData("rte", "Return from Exception"),
|
||||
IsaData("rtr", "Return and Restore"),
|
||||
IsaData("rts", "Return from Subroutine"),
|
||||
IsaData("sbcd", "Subtract Decimal with Extend"),
|
||||
IsaData("sCC", "Set Conditionally", conditionCodes = conditionCodes),
|
||||
IsaData("stop", "Stop"),
|
||||
IsaData("sub", "Subtract"),
|
||||
IsaData("suba", "Subtract Address"),
|
||||
IsaData("subi", "Subtract Immediate"),
|
||||
IsaData("subq", "Subtract Quick"),
|
||||
IsaData("subx", "Subtract with Extend"),
|
||||
IsaData("swap", "Swap Register Words"),
|
||||
IsaData("tas", "Test Operand and Set"),
|
||||
IsaData("trap", "Trap"),
|
||||
IsaData("trapv", "Trap on Overflow"),
|
||||
IsaData("tst", "Test Operand"),
|
||||
IsaData("unlk", "Unlink "),
|
||||
)
|
||||
|
||||
val mnemonics =
|
||||
isaData.asSequence()
|
||||
.flatMap {
|
||||
if (it.conditionCodes.isEmpty()) it.altMnemonics.plus(it.mnemonic) else it.altMnemonics.plus(it.conditionCodes
|
||||
.map { cc ->
|
||||
it.mnemonic.replace("CC", cc)
|
||||
})
|
||||
}
|
||||
.toSet()
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package de.platon42.intellij.plugins.m68k.lexer
|
||||
|
||||
import de.platon42.intellij.plugins.m68k.asm.M68kIsa.mnemonics
|
||||
|
||||
object LexerUtil {
|
||||
private val ASSIGNMENT_SEPARATORS = charArrayOf('=', ' ', '\t')
|
||||
|
||||
@JvmStatic
|
||||
fun isAsmMnemonic(text: CharSequence) = mnemonics.contains(text.toString().lowercase())
|
||||
|
||||
@JvmStatic
|
||||
fun pushbackAssignment(text: CharSequence) = text.length - 1 - text.indexOfAny(ASSIGNMENT_SEPARATORS)
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import com.intellij.psi.tree.IElementType;
|
||||
import static com.intellij.psi.TokenType.BAD_CHARACTER;
|
||||
import static com.intellij.psi.TokenType.WHITE_SPACE;
|
||||
import static de.platon42.intellij.plugins.m68k.psi.M68kTypes.*;
|
||||
import static de.platon42.intellij.plugins.m68k.lexer.LexerUtil.*;
|
||||
|
||||
%%
|
||||
|
||||
@@ -21,114 +22,199 @@ import static de.platon42.intellij.plugins.m68k.psi.M68kTypes.*;
|
||||
%function advance
|
||||
%type IElementType
|
||||
%unicode
|
||||
%ignorecase
|
||||
|
||||
EOL=\R
|
||||
WHITE_SPACE=\s+
|
||||
|
||||
EOL=\R
|
||||
WHITE_SPACE=\p{Blank}+
|
||||
EQU=([eE][qQ][uU])
|
||||
EVEN_TAG=((\p{Blank}+)?[eE][vV][eE][nN])
|
||||
CNOP_TAG=((\p{Blank}+)?[cC][nN][oO][pP])
|
||||
SECTION_TAG=((\p{Blank}+)?[sS][eE][cC][tT][iI][oO][nN])
|
||||
INCLUDE_TAG=((\p{Blank}+)?[iI][nN][cC][lL][uU][dD][eE])
|
||||
INCBIN_TAG=((\p{Blank}+)?[iI][nN][cC][bB][iI][nN])
|
||||
IF_TAG=((\p{Blank}+)?[iI][fF][:letter:]*)
|
||||
ELSE_TAG=((\p{Blank}+)?[eE][lL][sS][eE])
|
||||
ENDC_TAG=((\p{Blank}+)?[eE][nN][dD][cC])
|
||||
MACRO_TAG=((\p{Blank}+)?[mM][aA][cC][rR][oO])
|
||||
MACRO_END_TAG=((\p{Blank}+)?[eE][nN][dD][mM])
|
||||
REPT_TAG=((\p{Blank}+)?[rR][eE][pP][tT])
|
||||
REPT_END_TAG=((\p{Blank}+)?[eE][nN][dD][rR])
|
||||
FAIL_TAG=((\p{Blank}+)?[fF][aA][iI][lL])
|
||||
END_TAG=((\p{Blank}+)?[eE][nN][dD]).*
|
||||
AREG=(([aA][0-7])|sp|SP)
|
||||
DREG=([dD][0-7])
|
||||
PC=([pP][cC])
|
||||
REG_CCR=([cC][cC][rR])
|
||||
REG_SR=([sS][rR])
|
||||
REG_USP=([uU][sS][pP])
|
||||
REG_VBR=([vV][bB][rR])
|
||||
SYMBOL=(([:letter:]|_)(([:letter:]|[:digit:])|_)*)
|
||||
OPSIZE_BS=(\.([bB]|[sS]))
|
||||
OPSIZE_WL=(\.([wW]|[lL]))
|
||||
IF_TAG=(if[:letter:]*)
|
||||
AREG=((a[0-7])|sp)
|
||||
DREG=(d[0-7])
|
||||
ASSIGNMENT=(([:letter:]|_)(([:letter:]|[:digit:])|_)*((\p{Blank}+equ\p{Blank}+)|(\p{Blank}+set\p{Blank}+)|\p{Blank}*=\p{Blank}*))
|
||||
LOCAL_LABEL=(\.([:letter:]|_)(([:letter:]|[:digit:])|_)*:?)|(([:letter:]|_)(([:letter:]|[:digit:])|_)*\$:?)
|
||||
LOCAL_LABEL_WC=(\.([:letter:]|_)(([:letter:]|[:digit:])|_)*:)|(([:letter:]|_)(([:letter:]|[:digit:])|_)*\$:)
|
||||
GLOBAL_LABEL=(([:letter:]|_)(([:letter:]|[:digit:])|_)*:?:?)
|
||||
GLOBAL_LABEL_WC=(([:letter:]|_)(([:letter:]|[:digit:])|_)*::?)
|
||||
MNEMONIC=(([:letter:])+)
|
||||
SYMBOL=(([:letter:]|_|.)(([:letter:]|[:digit:])|_|\$)*)
|
||||
OPSIZE_BS=(\.[bs])
|
||||
OPSIZE_WL=(\.[wl])
|
||||
BINARY=(%[01]+)
|
||||
HEXADECIMAL=(\$[0-9a-fA-F]+)
|
||||
HEXADECIMAL=(\$[0-9a-f]+)
|
||||
OCTAL=(@[0-7]+)
|
||||
DECIMAL=([0-9]+)
|
||||
STRINGLIT=(`([^`\\]|\\.)*`|'([^'\\]|\\.)*'|\"([^\"\\]|\\.)*\")|<([^`\\]|\\.)*>
|
||||
COMMENT=(\p{Blank}*?[;*].*+)
|
||||
COMMENT=([;].*+)
|
||||
HASH_COMMENT=([#;*].*+)
|
||||
|
||||
%state NOSOL,INSTRPART,ASMINSTR,ASMOPS,ASSIGNMENT
|
||||
|
||||
%%
|
||||
<YYINITIAL> {
|
||||
{WHITE_SPACE} { return WHITE_SPACE; }
|
||||
{WHITE_SPACE} { yybegin(NOSOL); return WHITE_SPACE; }
|
||||
{EOL} { return WHITE_SPACE; }
|
||||
{ASSIGNMENT} { yybegin(ASSIGNMENT); yypushback(pushbackAssignment(yytext())); return SYMBOLDEF; }
|
||||
{LOCAL_LABEL} { yybegin(INSTRPART); return LOCAL_LABEL_DEF; }
|
||||
{GLOBAL_LABEL} { yybegin(INSTRPART); return GLOBAL_LABEL_DEF; }
|
||||
|
||||
":" { return COLON; }
|
||||
";" { return SEMICOLON; }
|
||||
"[" { return SQUARE_L; }
|
||||
"]" { return SQUARE_R; }
|
||||
"(" { return ROUND_L; }
|
||||
")" { return ROUND_R; }
|
||||
"," { return SEPARATOR; }
|
||||
"." { return DOT; }
|
||||
"#" { return HASH; }
|
||||
"$" { return DOLLAR; }
|
||||
"=" { return OP_ASSIGN; }
|
||||
"!" { return OP_UNARY_NOT; }
|
||||
"~" { return OP_UNARY_COMPL; }
|
||||
"+" { return OP_PLUS; }
|
||||
"-" { return OP_MINUS; }
|
||||
"*" { return OP_AR_MUL; }
|
||||
"/" { return OP_AR_DIV; }
|
||||
"%" { return OP_AR_MOD; }
|
||||
"<<" { return OP_AR_SHIFT_L; }
|
||||
">>" { return OP_AR_SHIFT_R; }
|
||||
"&" { return OP_BITWISE_AND; }
|
||||
"|" { return OP_BITWISE_OR; }
|
||||
"^" { return OP_BITWISE_XOR; }
|
||||
"&&" { return OP_LOGICAL_AND; }
|
||||
"||" { return OP_LOGICAL_OR; }
|
||||
"==" { return OP_CMP_EQ; }
|
||||
"<" { return OP_CMP_LT; }
|
||||
">" { return OP_CMP_GT; }
|
||||
">=" { return OP_CMP_GT_EQ; }
|
||||
"<=" { return OP_CMP_LT_EQ; }
|
||||
"!=" { return OP_CMP_NOT_EQ; }
|
||||
"<>" { return OP_CMP_NOT_EQ2; }
|
||||
{HASH_COMMENT} { return COMMENT; }
|
||||
}
|
||||
|
||||
{EOL} { return EOL; }
|
||||
{WHITE_SPACE} { return WHITE_SPACE; }
|
||||
{EQU} { return EQU; }
|
||||
{EVEN_TAG} { return EVEN_TAG; }
|
||||
{CNOP_TAG} { return CNOP_TAG; }
|
||||
{SECTION_TAG} { return SECTION_TAG; }
|
||||
{INCLUDE_TAG} { return INCLUDE_TAG; }
|
||||
{INCBIN_TAG} { return INCBIN_TAG; }
|
||||
{IF_TAG} { return IF_TAG; }
|
||||
{ELSE_TAG} { return ELSE_TAG; }
|
||||
{ENDC_TAG} { return ENDC_TAG; }
|
||||
{MACRO_TAG} { return MACRO_TAG; }
|
||||
{MACRO_END_TAG} { return MACRO_END_TAG; }
|
||||
{REPT_TAG} { return REPT_TAG; }
|
||||
{REPT_END_TAG} { return REPT_END_TAG; }
|
||||
{FAIL_TAG} { return FAIL_TAG; }
|
||||
{END_TAG} { return END_TAG; }
|
||||
{AREG} { return AREG; }
|
||||
{DREG} { return DREG; }
|
||||
{PC} { return PC; }
|
||||
{REG_CCR} { return REG_CCR; }
|
||||
{REG_SR} { return REG_SR; }
|
||||
{REG_USP} { return REG_USP; }
|
||||
{REG_VBR} { return REG_VBR; }
|
||||
{SYMBOL} { return SYMBOL; }
|
||||
{OPSIZE_BS} { return OPSIZE_BS; }
|
||||
{OPSIZE_WL} { return OPSIZE_WL; }
|
||||
{BINARY} { return BINARY; }
|
||||
{HEXADECIMAL} { return HEXADECIMAL; }
|
||||
{OCTAL} { return OCTAL; }
|
||||
{DECIMAL} { return DECIMAL; }
|
||||
{STRINGLIT} { return STRINGLIT; }
|
||||
{COMMENT} { return COMMENT; }
|
||||
<NOSOL> {
|
||||
{WHITE_SPACE} { return WHITE_SPACE; }
|
||||
{EOL} { yybegin(YYINITIAL); return WHITE_SPACE; }
|
||||
{LOCAL_LABEL_WC} { yybegin(INSTRPART); return LOCAL_LABEL_DEF; }
|
||||
{GLOBAL_LABEL_WC} { yybegin(INSTRPART); return GLOBAL_LABEL_DEF; }
|
||||
{MNEMONIC} { yybegin(ASMINSTR); return isAsmMnemonic(yytext()) ? MNEMONIC : SYMBOL; }
|
||||
{SYMBOL} { return SYMBOL; }
|
||||
|
||||
{HASH_COMMENT} { yybegin(YYINITIAL); return COMMENT; }
|
||||
}
|
||||
|
||||
<INSTRPART> {
|
||||
{WHITE_SPACE} { return WHITE_SPACE; }
|
||||
{EOL} { yybegin(YYINITIAL); return EOL; }
|
||||
|
||||
"even" { return EVEN_TAG; }
|
||||
"cnop" { return CNOP_TAG; }
|
||||
"section" { return SECTION_TAG; }
|
||||
"include" { return INCLUDE_TAG; }
|
||||
"incbin" { return INCBIN_TAG; }
|
||||
"else" { return ELSE_TAG; }
|
||||
"endc" { return ENDC_TAG; }
|
||||
"macro" { return MACRO_TAG; }
|
||||
"endm" { return MACRO_END_TAG; }
|
||||
"rept" { return REPT_TAG; }
|
||||
"endr" { return REPT_END_TAG; }
|
||||
"fail" { return FAIL_TAG; }
|
||||
"end" { return END_TAG; }
|
||||
|
||||
{IF_TAG} { return IF_TAG; }
|
||||
|
||||
{MNEMONIC} { return isAsmMnemonic(yytext()) ? MNEMONIC : SYMBOL; }
|
||||
{SYMBOL} { return SYMBOL; }
|
||||
|
||||
{COMMENT} { yybegin(YYINITIAL); return COMMENT; }
|
||||
}
|
||||
|
||||
<ASMINSTR> {
|
||||
{WHITE_SPACE} { yybegin(ASMOPS); return WHITE_SPACE; }
|
||||
{EOL} { yybegin(YYINITIAL); return EOL; }
|
||||
|
||||
{OPSIZE_BS} { return OPSIZE_BS; }
|
||||
{OPSIZE_WL} { return OPSIZE_WL; }
|
||||
|
||||
{COMMENT} { yybegin(YYINITIAL); return COMMENT; }
|
||||
}
|
||||
|
||||
<ASSIGNMENT> {
|
||||
{WHITE_SPACE} { return WHITE_SPACE; } // FIXME space optionally introduces comment
|
||||
{EOL} { yybegin(YYINITIAL); return EOL; }
|
||||
|
||||
{BINARY} { return BINARY; }
|
||||
{HEXADECIMAL} { return HEXADECIMAL; }
|
||||
{OCTAL} { return OCTAL; }
|
||||
{DECIMAL} { return DECIMAL; }
|
||||
{STRINGLIT} { return STRINGLIT; }
|
||||
|
||||
"equ" { return EQU; }
|
||||
"set" { return EQU; }
|
||||
|
||||
"<<" { return OP_AR_SHIFT_L; }
|
||||
">>" { return OP_AR_SHIFT_R; }
|
||||
"&&" { return OP_LOGICAL_AND; }
|
||||
"||" { return OP_LOGICAL_OR; }
|
||||
"==" { return OP_CMP_EQ; }
|
||||
"<>" { return OP_CMP_NOT_EQ; }
|
||||
">=" { return OP_CMP_GT_EQ; }
|
||||
"<=" { return OP_CMP_LT_EQ; }
|
||||
"!=" { return OP_CMP_NOT_EQ; }
|
||||
"<" { return OP_CMP_LT; }
|
||||
">" { return OP_CMP_GT; }
|
||||
"&" { return OP_BITWISE_AND; }
|
||||
"|" { return OP_BITWISE_OR; }
|
||||
"^" { return OP_BITWISE_XOR; }
|
||||
":" { return COLON; }
|
||||
";" { return SEMICOLON; }
|
||||
"[" { return SQUARE_L; }
|
||||
"]" { return SQUARE_R; }
|
||||
"(" { return ROUND_L; }
|
||||
")" { return ROUND_R; }
|
||||
"." { return DOT; }
|
||||
"$" { return DOLLAR; }
|
||||
"=" { return OP_ASSIGN; }
|
||||
"!" { return OP_UNARY_NOT; }
|
||||
"~" { return OP_UNARY_COMPL; }
|
||||
"+" { return OP_PLUS; }
|
||||
"-" { return OP_MINUS; }
|
||||
"*" { return OP_AR_MUL; }
|
||||
"/" { return OP_AR_DIV; }
|
||||
"%" { return OP_AR_MOD; }
|
||||
|
||||
{SYMBOL} { return SYMBOL; }
|
||||
|
||||
{COMMENT} { return COMMENT; }
|
||||
}
|
||||
|
||||
<ASMOPS> {
|
||||
{WHITE_SPACE} { return WHITE_SPACE; } // FIXME space optionally introduces comment
|
||||
{EOL} { yybegin(YYINITIAL); return EOL; }
|
||||
|
||||
{BINARY} { return BINARY; }
|
||||
{HEXADECIMAL} { return HEXADECIMAL; }
|
||||
{OCTAL} { return OCTAL; }
|
||||
{DECIMAL} { return DECIMAL; }
|
||||
{STRINGLIT} { return STRINGLIT; }
|
||||
|
||||
{OPSIZE_BS} { return OPSIZE_BS; }
|
||||
{OPSIZE_WL} { return OPSIZE_WL; }
|
||||
|
||||
"<<" { return OP_AR_SHIFT_L; }
|
||||
">>" { return OP_AR_SHIFT_R; }
|
||||
"&&" { return OP_LOGICAL_AND; }
|
||||
"||" { return OP_LOGICAL_OR; }
|
||||
"==" { return OP_CMP_EQ; }
|
||||
"<>" { return OP_CMP_NOT_EQ; }
|
||||
">=" { return OP_CMP_GT_EQ; }
|
||||
"<=" { return OP_CMP_LT_EQ; }
|
||||
"!=" { return OP_CMP_NOT_EQ; }
|
||||
"<" { return OP_CMP_LT; }
|
||||
">" { return OP_CMP_GT; }
|
||||
"&" { return OP_BITWISE_AND; }
|
||||
"|" { return OP_BITWISE_OR; }
|
||||
"^" { return OP_BITWISE_XOR; }
|
||||
":" { return COLON; }
|
||||
";" { return SEMICOLON; }
|
||||
"[" { return SQUARE_L; }
|
||||
"]" { return SQUARE_R; }
|
||||
"(" { return ROUND_L; }
|
||||
")" { return ROUND_R; }
|
||||
"," { return SEPARATOR; }
|
||||
"." { return DOT; }
|
||||
"#" { return HASH; }
|
||||
"$" { return DOLLAR; }
|
||||
"=" { return OP_ASSIGN; }
|
||||
"!" { return OP_UNARY_NOT; }
|
||||
"~" { return OP_UNARY_COMPL; }
|
||||
"+" { return OP_PLUS; }
|
||||
"-" { return OP_MINUS; }
|
||||
"*" { return OP_AR_MUL; }
|
||||
"/" { return OP_AR_DIV; }
|
||||
"%" { return OP_AR_MOD; }
|
||||
|
||||
{AREG} { return AREG; }
|
||||
{DREG} { return DREG; }
|
||||
"pc" { return PC; }
|
||||
"ccr" { return REG_CCR; }
|
||||
"sr" { return REG_SR; }
|
||||
"usp" { return REG_USP; }
|
||||
"vbr" { return REG_VBR; }
|
||||
|
||||
{SYMBOL} { return SYMBOL; }
|
||||
|
||||
{COMMENT} { return COMMENT; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -30,43 +30,44 @@
|
||||
EOL = 'regexp:\R'
|
||||
WHITE_SPACE = 'regexp:\p{Blank}+'
|
||||
|
||||
EQU = 'regexp:([eE][qQ][uU])'
|
||||
EQU = 'equ'
|
||||
|
||||
EVEN_TAG = 'regexp:((\p{Blank}+)?[eE][vV][eE][nN])'
|
||||
CNOP_TAG = 'regexp:((\p{Blank}+)?[cC][nN][oO][pP])'
|
||||
SECTION_TAG = 'regexp:((\p{Blank}+)?[sS][eE][cC][tT][iI][oO][nN])'
|
||||
EVEN_TAG = 'even'
|
||||
CNOP_TAG = 'cnop'
|
||||
SECTION_TAG = 'section'
|
||||
|
||||
INCLUDE_TAG = 'regexp:((\p{Blank}+)?[iI][nN][cC][lL][uU][dD][eE])'
|
||||
INCBIN_TAG = 'regexp:((\p{Blank}+)?[iI][nN][cC][bB][iI][nN])'
|
||||
INCLUDE_TAG = 'include'
|
||||
INCBIN_TAG = 'incbin'
|
||||
|
||||
IF_TAG = 'regexp:((\p{Blank}+)?[iI][fF]\p{Alpha}*)'
|
||||
ELSE_TAG = 'regexp:((\p{Blank}+)?[eE][lL][sS][eE])'
|
||||
ENDC_TAG = 'regexp:((\p{Blank}+)?[eE][nN][dD][cC])'
|
||||
MACRO_TAG = 'regexp:((\p{Blank}+)?[mM][aA][cC][rR][oO])'
|
||||
MACRO_END_TAG = 'regexp:((\p{Blank}+)?[eE][nN][dD][mM])'
|
||||
REPT_TAG = 'regexp:((\p{Blank}+)?[rR][eE][pP][tT])'
|
||||
REPT_END_TAG = 'regexp:((\p{Blank}+)?[eE][nN][dD][rR])'
|
||||
FAIL_TAG = 'regexp:((\p{Blank}+)?[fF][aA][iI][lL])'
|
||||
END_TAG = 'regexp:((\p{Blank}+)?[eE][nN][dD]).*'
|
||||
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:(([aA][0-7])|sp|SP)'
|
||||
DREG = 'regexp:([dD][0-7])'
|
||||
PC = 'regexp:([pP][cC])'
|
||||
REG_CCR = 'regexp:([cC][cC][rR])'
|
||||
REG_SR = 'regexp:([sS][rR])'
|
||||
REG_USP = 'regexp:([uU][sS][pP])'
|
||||
REG_VBR = 'regexp:([vV][bB][rR])'
|
||||
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'
|
||||
|
||||
// LOCAL_LABEL = '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 = 'regexp:(!(\p{Blank}+)(\p{Alpha}|_)(\p{Alnum}|_)*:?:?)|((\p{Blank}*)?(\p{Alpha}|_)(\p{Alnum}|_)*::?)'
|
||||
// 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})+)'
|
||||
MNEMONIC = 'regexp:((\p{Alpha})+)'
|
||||
SYMBOL = 'regexp:((\p{Alpha}|_)(\p{Alnum}|_)*)'
|
||||
OPSIZE_BS = 'regexp:(\.([bB]|[sS]))'
|
||||
OPSIZE_WL = 'regexp:(\.([wW]|[lL]))'
|
||||
OPSIZE_BS = 'regexp:(\.[bs])'
|
||||
OPSIZE_WL = 'regexp:(\.[wl])'
|
||||
|
||||
BINARY = 'regexp:(%[01]+)'
|
||||
HEXADECIMAL = 'regexp:(\$[0-9a-fA-F]+)'
|
||||
HEXADECIMAL = 'regexp:(\$[0-9a-f]+)'
|
||||
OCTAL = 'regexp:(@[0-7]+)'
|
||||
DECIMAL = 'regexp:([0-9]+)'
|
||||
|
||||
@@ -107,7 +108,7 @@
|
||||
OP_CMP_GT_EQ = '>='
|
||||
OP_CMP_LT_EQ = '<='
|
||||
OP_CMP_NOT_EQ = '!='
|
||||
OP_CMP_NOT_EQ2 = '<>'
|
||||
// OP_CMP_NOT_EQ2 = '<>'
|
||||
|
||||
COMMENT = 'regexp:(\p{Blank}*?[;*].*+)'//|(!\s#+.*+)'
|
||||
// EOL_COMMENT = 'regexp:((\p{Blank}+;.*?)|(\p{Blank}+\.*+))'
|
||||
@@ -116,41 +117,32 @@
|
||||
|
||||
M68kFile ::= line*
|
||||
|
||||
private BlankLine ::= WHITE_SPACE?
|
||||
|
||||
private line ::= !<<eof>> statement EOL
|
||||
|
||||
statement ::= (Assignment
|
||||
| PreprocessorDirective
|
||||
| LabelInsts
|
||||
| BlankLine)
|
||||
| LabelInsts)
|
||||
{pin=1 recoverWhile=statement_recover};
|
||||
|
||||
private statement_recover ::= !(EOL)
|
||||
|
||||
Assignment ::= SYMBOL ((WHITE_SPACE? OP_ASSIGN WHITE_SPACE?)|(WHITE_SPACE EQU WHITE_SPACE)) expr
|
||||
Assignment ::= SYMBOLDEF (OP_ASSIGN|EQU) expr
|
||||
|
||||
private LabelInsts ::= LabelOnly|LabelWithInstruction|InstructionOnly
|
||||
|
||||
private LabelOnly ::= Label
|
||||
private LabelWithInstruction ::= Label WHITE_SPACE Instruction
|
||||
private InstructionOnly ::= WHITE_SPACE Instruction
|
||||
private LabelWithInstruction ::= Label Instruction
|
||||
private InstructionOnly ::= Instruction
|
||||
|
||||
LocalLabel ::= (!WHITE_SPACE ((DOT SYMBOL)|(SYMBOL DOLLAR)) COLON?)|(WHITE_SPACE? ((DOT SYMBOL)|(SYMBOL DOLLAR)) COLON)
|
||||
GlobalLabel ::= (!WHITE_SPACE SYMBOL (COLON? COLON?)?)|(WHITE_SPACE? SYMBOL COLON COLON?)
|
||||
//private Label ::= LocalLabel | GlobalLabel
|
||||
|
||||
//private LabelInsts ::= Label|(Label? WHITE_SPACE Instruction)
|
||||
//
|
||||
//LocalLabel ::= LOCAL_LABEL {extends=Label}
|
||||
//GlobalLabel ::= GLOBAL_LABEL {extends=Label}
|
||||
LocalLabel ::= LOCAL_LABEL_DEF {extends=Label}
|
||||
GlobalLabel ::= GLOBAL_LABEL_DEF {extends=Label}
|
||||
Label ::= LocalLabel | GlobalLabel
|
||||
|
||||
OperandSize ::= (OPSIZE_BS|OPSIZE_WL)
|
||||
AddressSize ::= OPSIZE_WL
|
||||
DataWidth ::= OPSIZE_WL
|
||||
|
||||
AsmOp ::= SYMBOL OperandSize?
|
||||
AsmOp ::= MNEMONIC OperandSize?
|
||||
|
||||
PreprocessorDirective ::= SYMBOL?
|
||||
(END_TAG
|
||||
@@ -167,12 +159,12 @@ PreprocessorDirective ::= SYMBOL?
|
||||
| REPT_TAG
|
||||
| REPT_END_TAG
|
||||
| FAIL_TAG)
|
||||
(WHITE_SPACE PreprocessorOperands)?
|
||||
PreprocessorOperands?
|
||||
|
||||
MacroCall ::= SYMBOL PreprocessorOperands?
|
||||
AsmInstruction ::= AsmOp (WHITE_SPACE AsmOperands)?
|
||||
//Instruction ::= AsmInstruction | MacroCall
|
||||
external Instruction ::= parseMacroCallOrAsmInstruction
|
||||
AsmInstruction ::= AsmOp AsmOperands?
|
||||
private Instruction ::= AsmInstruction | MacroCall
|
||||
//external Instruction ::= parseMacroCallOrAsmInstruction
|
||||
|
||||
AsmOperands ::= FirstAsmOperand (SEPARATOR NextAsmOperand)*
|
||||
|
||||
@@ -207,11 +199,12 @@ AddressingMode ::= AbsoluteAddressAddressingMode
|
||||
| ProgramCounterIndirectWithIndexNewAddressingMode
|
||||
| AddressRegisterIndirectPreDecAddressingMode
|
||||
| AddressRegisterIndirectPostIncAddressingMode
|
||||
| RegisterListAddressingMode
|
||||
| ImmediateData
|
||||
|
||||
SpecialRegisterDirectAddressingMode ::= SpecialRegister
|
||||
DataRegisterDirectAddressingMode ::= DataRegister
|
||||
AddressRegisterDirectAddressingMode ::= AddressRegister
|
||||
DataRegisterDirectAddressingMode ::= DataRegister !(OP_MINUS|OP_AR_DIV)
|
||||
AddressRegisterDirectAddressingMode ::= AddressRegister !(OP_MINUS|OP_AR_DIV)
|
||||
AddressRegisterIndirectAddressingMode ::= ROUND_L AddressRegister ROUND_R !OP_PLUS
|
||||
AddressRegisterIndirectPostIncAddressingMode ::= ROUND_L AddressRegister ROUND_R OP_PLUS
|
||||
AddressRegisterIndirectPreDecAddressingMode ::= OP_MINUS ROUND_L AddressRegister ROUND_R
|
||||
@@ -224,6 +217,8 @@ ProgramCounterIndirectWithDisplacementNewAddressingMode ::= ROUND_L expr SEPARAT
|
||||
ProgramCounterIndirectWithIndexOldAddressingMode ::= expr ROUND_L PC SEPARATOR DataOrAddressRegister DataWidth? ROUND_R
|
||||
ProgramCounterIndirectWithIndexNewAddressingMode ::= ROUND_L expr SEPARATOR PC SEPARATOR DataOrAddressRegister DataWidth? ROUND_R
|
||||
AbsoluteAddressAddressingMode ::= expr AddressSize? !ROUND_L
|
||||
private RegisterRange ::= (DataOrAddressRegister OP_MINUS DataOrAddressRegister)
|
||||
RegisterListAddressingMode ::= (DataOrAddressRegister|RegisterRange) (OP_AR_DIV (DataOrAddressRegister|RegisterRange))*
|
||||
ImmediateData ::= HASH expr {extends=AddressingMode}
|
||||
|
||||
expr ::= binary_logical_or_expr
|
||||
@@ -268,7 +263,8 @@ binary_cmp_le_expr ::= expr OP_CMP_LT_EQ expr
|
||||
binary_cmp_gt_expr ::= expr OP_CMP_GT expr
|
||||
binary_cmp_ge_expr ::= expr OP_CMP_GT_EQ expr
|
||||
binary_cmp_eq_expr ::= expr OP_CMP_EQ expr
|
||||
binary_cmp_ne_expr ::= expr (OP_CMP_NOT_EQ|OP_CMP_NOT_EQ2) expr
|
||||
binary_cmp_ne_expr ::= expr OP_CMP_NOT_EQ expr
|
||||
//binary_cmp_ne_expr ::= expr (OP_CMP_NOT_EQ|OP_CMP_NOT_EQ2) expr
|
||||
binary_logical_and_expr ::= expr OP_LOGICAL_AND expr
|
||||
binary_logical_or_expr ::= expr OP_LOGICAL_OR expr
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
public class M68kParserDefinition implements ParserDefinition {
|
||||
public static final TokenSet STRING_LITERALS = TokenSet.create(M68kTypes.STRINGLIT);
|
||||
public static final TokenSet COMMENTS = TokenSet.create(M68kTypes.COMMENT);
|
||||
public static final TokenSet WHITE_SPACE = TokenSet.create(M68kTypes.WHITE_SPACE);
|
||||
|
||||
public M68kParserDefinition() {
|
||||
}
|
||||
@@ -39,11 +38,6 @@ public class M68kParserDefinition implements ParserDefinition {
|
||||
return M68kFileElementType.INSTANCE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public @NotNull TokenSet getWhitespaceTokens() {
|
||||
// return WHITE_SPACE;
|
||||
// }
|
||||
|
||||
@Override
|
||||
public @NotNull TokenSet getCommentTokens() {
|
||||
return COMMENTS;
|
||||
|
||||
Reference in New Issue
Block a user