Progress on Lexer and BNF.

This commit is contained in:
2021-07-15 10:44:03 +02:00
parent 9047c53a0e
commit eb4552fa83
73 changed files with 1583 additions and 1646 deletions
@@ -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;