Added first tests, improved BNF and Lexer. Fixed extra space in assignment symbol.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -273,44 +273,44 @@ public class M68kParser implements PsiParser, LightPsiParser {
|
||||
}
|
||||
|
||||
/* ********************************************************** */
|
||||
// AbsoluteAddressAddressingMode
|
||||
// | SpecialRegisterDirectAddressingMode
|
||||
// | DataRegisterDirectAddressingMode
|
||||
// | AddressRegisterDirectAddressingMode
|
||||
// ImmediateData
|
||||
// | AddressRegisterIndirectPreDecAddressingMode
|
||||
// | AddressRegisterIndirectPostIncAddressingMode
|
||||
// | AddressRegisterIndirectAddressingMode
|
||||
// | AddressRegisterIndirectWithDisplacementOldAddressingMode
|
||||
// | ProgramCounterIndirectWithDisplacementOldAddressingMode
|
||||
// | AddressRegisterIndirectWithIndexOldAddressingMode
|
||||
// | ProgramCounterIndirectWithIndexOldAddressingMode
|
||||
// | AddressRegisterIndirectWithDisplacementNewAddressingMode
|
||||
// | ProgramCounterIndirectWithDisplacementNewAddressingMode
|
||||
// | AddressRegisterIndirectWithIndexNewAddressingMode
|
||||
// | ProgramCounterIndirectWithIndexNewAddressingMode
|
||||
// | AddressRegisterIndirectPreDecAddressingMode
|
||||
// | AddressRegisterIndirectPostIncAddressingMode
|
||||
// | AddressRegisterIndirectWithDisplacementOldAddressingMode
|
||||
// | ProgramCounterIndirectWithDisplacementOldAddressingMode
|
||||
// | AddressRegisterIndirectWithIndexOldAddressingMode
|
||||
// | ProgramCounterIndirectWithIndexOldAddressingMode
|
||||
// | SpecialRegisterDirectAddressingMode
|
||||
// | DataRegisterDirectAddressingMode
|
||||
// | AddressRegisterDirectAddressingMode
|
||||
// | RegisterListAddressingMode
|
||||
// | ImmediateData
|
||||
// | AbsoluteAddressAddressingMode
|
||||
public static boolean AddressingMode(PsiBuilder b, int l) {
|
||||
if (!recursion_guard_(b, l, "AddressingMode")) return false;
|
||||
boolean r;
|
||||
Marker m = enter_section_(b, l, _COLLAPSE_, ADDRESSING_MODE, "<AddressingMode>");
|
||||
r = AbsoluteAddressAddressingMode(b, l + 1);
|
||||
if (!r) r = SpecialRegisterDirectAddressingMode(b, l + 1);
|
||||
if (!r) r = DataRegisterDirectAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterDirectAddressingMode(b, l + 1);
|
||||
r = ImmediateData(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectPreDecAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectPostIncAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectWithDisplacementOldAddressingMode(b, l + 1);
|
||||
if (!r) r = ProgramCounterIndirectWithDisplacementOldAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectWithIndexOldAddressingMode(b, l + 1);
|
||||
if (!r) r = ProgramCounterIndirectWithIndexOldAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectWithDisplacementNewAddressingMode(b, l + 1);
|
||||
if (!r) r = ProgramCounterIndirectWithDisplacementNewAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectWithIndexNewAddressingMode(b, l + 1);
|
||||
if (!r) r = ProgramCounterIndirectWithIndexNewAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectPreDecAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectPostIncAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectWithDisplacementOldAddressingMode(b, l + 1);
|
||||
if (!r) r = ProgramCounterIndirectWithDisplacementOldAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterIndirectWithIndexOldAddressingMode(b, l + 1);
|
||||
if (!r) r = ProgramCounterIndirectWithIndexOldAddressingMode(b, l + 1);
|
||||
if (!r) r = SpecialRegisterDirectAddressingMode(b, l + 1);
|
||||
if (!r) r = DataRegisterDirectAddressingMode(b, l + 1);
|
||||
if (!r) r = AddressRegisterDirectAddressingMode(b, l + 1);
|
||||
if (!r) r = RegisterListAddressingMode(b, l + 1);
|
||||
if (!r) r = ImmediateData(b, l + 1);
|
||||
if (!r) r = AbsoluteAddressAddressingMode(b, l + 1);
|
||||
exit_section_(b, l, m, r, false, null);
|
||||
return r;
|
||||
}
|
||||
@@ -356,18 +356,18 @@ public class M68kParser implements PsiParser, LightPsiParser {
|
||||
}
|
||||
|
||||
/* ********************************************************** */
|
||||
// FirstAsmOperand (SEPARATOR NextAsmOperand)*
|
||||
// AddressingMode (SEPARATOR AddressingMode)*
|
||||
public static boolean AsmOperands(PsiBuilder b, int l) {
|
||||
if (!recursion_guard_(b, l, "AsmOperands")) return false;
|
||||
boolean r;
|
||||
Marker m = enter_section_(b, l, _NONE_, ASM_OPERANDS, "<asm operands>");
|
||||
r = FirstAsmOperand(b, l + 1);
|
||||
r = AddressingMode(b, l + 1);
|
||||
r = r && AsmOperands_1(b, l + 1);
|
||||
exit_section_(b, l, m, r, false, null);
|
||||
return r;
|
||||
}
|
||||
|
||||
// (SEPARATOR NextAsmOperand)*
|
||||
// (SEPARATOR AddressingMode)*
|
||||
private static boolean AsmOperands_1(PsiBuilder b, int l) {
|
||||
if (!recursion_guard_(b, l, "AsmOperands_1")) return false;
|
||||
while (true) {
|
||||
@@ -378,13 +378,13 @@ public class M68kParser implements PsiParser, LightPsiParser {
|
||||
return true;
|
||||
}
|
||||
|
||||
// SEPARATOR NextAsmOperand
|
||||
// SEPARATOR AddressingMode
|
||||
private static boolean AsmOperands_1_0(PsiBuilder b, int l) {
|
||||
if (!recursion_guard_(b, l, "AsmOperands_1_0")) return false;
|
||||
boolean r;
|
||||
Marker m = enter_section_(b);
|
||||
r = consumeToken(b, SEPARATOR);
|
||||
r = r && NextAsmOperand(b, l + 1);
|
||||
r = r && AddressingMode(b, l + 1);
|
||||
exit_section_(b, m, null, r);
|
||||
return r;
|
||||
}
|
||||
@@ -481,12 +481,6 @@ public class M68kParser implements PsiParser, LightPsiParser {
|
||||
return r;
|
||||
}
|
||||
|
||||
/* ********************************************************** */
|
||||
// AddressingMode
|
||||
static boolean FirstAsmOperand(PsiBuilder b, int l) {
|
||||
return AddressingMode(b, l + 1);
|
||||
}
|
||||
|
||||
/* ********************************************************** */
|
||||
// GLOBAL_LABEL_DEF
|
||||
public static boolean GlobalLabel(PsiBuilder b, int l) {
|
||||
@@ -543,12 +537,12 @@ public class M68kParser implements PsiParser, LightPsiParser {
|
||||
}
|
||||
|
||||
/* ********************************************************** */
|
||||
// LabelOnly|LabelWithInstruction|InstructionOnly
|
||||
// LabelWithInstruction | LabelOnly | InstructionOnly
|
||||
static boolean LabelInsts(PsiBuilder b, int l) {
|
||||
if (!recursion_guard_(b, l, "LabelInsts")) return false;
|
||||
boolean r;
|
||||
r = LabelOnly(b, l + 1);
|
||||
if (!r) r = LabelWithInstruction(b, l + 1);
|
||||
r = LabelWithInstruction(b, l + 1);
|
||||
if (!r) r = LabelOnly(b, l + 1);
|
||||
if (!r) r = InstructionOnly(b, l + 1);
|
||||
return r;
|
||||
}
|
||||
@@ -616,12 +610,6 @@ public class M68kParser implements PsiParser, LightPsiParser {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* ********************************************************** */
|
||||
// AddressingMode
|
||||
static boolean NextAsmOperand(PsiBuilder b, int l) {
|
||||
return AddressingMode(b, l + 1);
|
||||
}
|
||||
|
||||
/* ********************************************************** */
|
||||
// OPSIZE_BS|OPSIZE_WL
|
||||
public static boolean OperandSize(PsiBuilder b, int l) {
|
||||
|
||||
@@ -3,11 +3,18 @@ package de.platon42.intellij.plugins.m68k.lexer
|
||||
import de.platon42.intellij.plugins.m68k.asm.M68kIsa.mnemonics
|
||||
|
||||
object LexerUtil {
|
||||
private val ASSIGNMENT_SEPARATORS = charArrayOf('=', ' ', '\t')
|
||||
|
||||
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)
|
||||
fun pushbackAssignment(text: CharSequence): Int {
|
||||
val spacePos = text.indexOfAny(ASSIGNMENT_SEPARATORS)
|
||||
if (spacePos > -1) {
|
||||
return text.length - spacePos
|
||||
}
|
||||
return text.length - 1 - text.indexOf('=')
|
||||
}
|
||||
}
|
||||
@@ -38,7 +38,7 @@ LOCAL_LABEL_WC=(\.([:letter:]|_)(([:letter:]|[:digit:])|_)*:)|(([:letter:]|_)(([
|
||||
GLOBAL_LABEL=(([:letter:]|_)(([:letter:]|[:digit:])|_)*:?:?)
|
||||
GLOBAL_LABEL_WC=(([:letter:]|_)(([:letter:]|[:digit:])|_)*::?)
|
||||
MNEMONIC=(([:letter:])+)
|
||||
SYMBOL=(([:letter:]|_|.)(([:letter:]|[:digit:])|_|\$)*)
|
||||
SYMBOL=(([:letter:]|_|\.)(([:letter:]|[:digit:])|[_\$])*)
|
||||
OPSIZE_BS=(\.[bs])
|
||||
OPSIZE_WL=(\.[wl])
|
||||
BINARY=(%[01]+)
|
||||
@@ -49,7 +49,7 @@ STRINGLIT=(`([^`\\]|\\.)*`|'([^'\\]|\\.)*'|\"([^\"\\]|\\.)*\")|<([^`\\]|\\.)*>
|
||||
COMMENT=([;].*+)
|
||||
HASH_COMMENT=([#;*].*+)
|
||||
|
||||
%state NOSOL,INSTRPART,ASMINSTR,ASMOPS,ASSIGNMENT
|
||||
%state NOSOL,INSTRPART,ASMINSTR,ASMOPS,ASSIGNMENT,WAITEOL
|
||||
|
||||
%%
|
||||
<YYINITIAL> {
|
||||
@@ -67,8 +67,8 @@ HASH_COMMENT=([#;*].*+)
|
||||
{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; }
|
||||
{MNEMONIC} { if(isAsmMnemonic(yytext())) { yybegin(ASMINSTR); return MNEMONIC; } else { yybegin(INSTRPART); return SYMBOL; } }
|
||||
{SYMBOL} { yybegin(INSTRPART); return SYMBOL; }
|
||||
|
||||
{HASH_COMMENT} { yybegin(YYINITIAL); return COMMENT; }
|
||||
}
|
||||
@@ -93,10 +93,10 @@ HASH_COMMENT=([#;*].*+)
|
||||
|
||||
{IF_TAG} { return IF_TAG; }
|
||||
|
||||
{MNEMONIC} { return isAsmMnemonic(yytext()) ? MNEMONIC : SYMBOL; }
|
||||
{MNEMONIC} { if(isAsmMnemonic(yytext())) { yybegin(ASMINSTR); return MNEMONIC; } else { return SYMBOL; } }
|
||||
{SYMBOL} { return SYMBOL; }
|
||||
|
||||
{COMMENT} { yybegin(YYINITIAL); return COMMENT; }
|
||||
{COMMENT} { yybegin(WAITEOL); return COMMENT; }
|
||||
}
|
||||
|
||||
<ASMINSTR> {
|
||||
@@ -106,7 +106,7 @@ HASH_COMMENT=([#;*].*+)
|
||||
{OPSIZE_BS} { return OPSIZE_BS; }
|
||||
{OPSIZE_WL} { return OPSIZE_WL; }
|
||||
|
||||
{COMMENT} { yybegin(YYINITIAL); return COMMENT; }
|
||||
{COMMENT} { yybegin(WAITEOL); return COMMENT; }
|
||||
}
|
||||
|
||||
<ASSIGNMENT> {
|
||||
@@ -155,7 +155,7 @@ HASH_COMMENT=([#;*].*+)
|
||||
|
||||
{SYMBOL} { return SYMBOL; }
|
||||
|
||||
{COMMENT} { return COMMENT; }
|
||||
{COMMENT} { yybegin(WAITEOL); return COMMENT; }
|
||||
}
|
||||
|
||||
<ASMOPS> {
|
||||
@@ -171,6 +171,14 @@ HASH_COMMENT=([#;*].*+)
|
||||
{OPSIZE_BS} { return OPSIZE_BS; }
|
||||
{OPSIZE_WL} { return OPSIZE_WL; }
|
||||
|
||||
{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; }
|
||||
|
||||
"<<" { return OP_AR_SHIFT_L; }
|
||||
">>" { return OP_AR_SHIFT_R; }
|
||||
"&&" { return OP_LOGICAL_AND; }
|
||||
@@ -204,18 +212,15 @@ HASH_COMMENT=([#;*].*+)
|
||||
"/" { 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; }
|
||||
{COMMENT} { yybegin(WAITEOL); return COMMENT; }
|
||||
|
||||
}
|
||||
|
||||
<WAITEOL>
|
||||
{
|
||||
{EOL} { yybegin(YYINITIAL); return EOL; }
|
||||
}
|
||||
|
||||
[^] { return BAD_CHARACTER; }
|
||||
|
||||
@@ -128,7 +128,7 @@ private statement_recover ::= !(EOL)
|
||||
|
||||
Assignment ::= SYMBOLDEF (OP_ASSIGN|EQU) expr
|
||||
|
||||
private LabelInsts ::= LabelOnly|LabelWithInstruction|InstructionOnly
|
||||
private LabelInsts ::= LabelWithInstruction | LabelOnly | InstructionOnly
|
||||
|
||||
private LabelOnly ::= Label
|
||||
private LabelWithInstruction ::= Label Instruction
|
||||
@@ -166,11 +166,7 @@ AsmInstruction ::= AsmOp AsmOperands?
|
||||
private Instruction ::= AsmInstruction | MacroCall
|
||||
//external Instruction ::= parseMacroCallOrAsmInstruction
|
||||
|
||||
AsmOperands ::= FirstAsmOperand (SEPARATOR NextAsmOperand)*
|
||||
|
||||
private FirstAsmOperand ::= AddressingMode
|
||||
|
||||
private NextAsmOperand ::= AddressingMode
|
||||
AsmOperands ::= AddressingMode (SEPARATOR AddressingMode)*
|
||||
|
||||
private PreprocessorOperands ::= PreprocessorOperand (SEPARATOR PreprocessorOperand)*
|
||||
|
||||
@@ -184,23 +180,23 @@ Register ::= DataRegister | AddressRegister | SpecialRegister
|
||||
|
||||
private DataOrAddressRegister ::= DataRegister | AddressRegister
|
||||
|
||||
AddressingMode ::= AbsoluteAddressAddressingMode
|
||||
| SpecialRegisterDirectAddressingMode
|
||||
| DataRegisterDirectAddressingMode
|
||||
| AddressRegisterDirectAddressingMode
|
||||
AddressingMode ::= ImmediateData
|
||||
| AddressRegisterIndirectPreDecAddressingMode
|
||||
| AddressRegisterIndirectPostIncAddressingMode
|
||||
| AddressRegisterIndirectAddressingMode
|
||||
| AddressRegisterIndirectWithDisplacementOldAddressingMode
|
||||
| ProgramCounterIndirectWithDisplacementOldAddressingMode
|
||||
| AddressRegisterIndirectWithIndexOldAddressingMode
|
||||
| ProgramCounterIndirectWithIndexOldAddressingMode
|
||||
| AddressRegisterIndirectWithDisplacementNewAddressingMode
|
||||
| ProgramCounterIndirectWithDisplacementNewAddressingMode
|
||||
| AddressRegisterIndirectWithIndexNewAddressingMode
|
||||
| ProgramCounterIndirectWithIndexNewAddressingMode
|
||||
| AddressRegisterIndirectPreDecAddressingMode
|
||||
| AddressRegisterIndirectPostIncAddressingMode
|
||||
| AddressRegisterIndirectWithDisplacementOldAddressingMode
|
||||
| ProgramCounterIndirectWithDisplacementOldAddressingMode
|
||||
| AddressRegisterIndirectWithIndexOldAddressingMode
|
||||
| ProgramCounterIndirectWithIndexOldAddressingMode
|
||||
| SpecialRegisterDirectAddressingMode
|
||||
| DataRegisterDirectAddressingMode
|
||||
| AddressRegisterDirectAddressingMode
|
||||
| RegisterListAddressingMode
|
||||
| ImmediateData
|
||||
| AbsoluteAddressAddressingMode
|
||||
|
||||
SpecialRegisterDirectAddressingMode ::= SpecialRegister
|
||||
DataRegisterDirectAddressingMode ::= DataRegister !(OP_MINUS|OP_AR_DIV)
|
||||
|
||||
Reference in New Issue
Block a user