Added first tests, improved BNF and Lexer. Fixed extra space in assignment symbol.

This commit is contained in:
2021-07-15 12:04:05 +02:00
parent 1dc418ae84
commit 2fe70deee2
33 changed files with 982 additions and 464 deletions
@@ -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)