Intermediate commit for BNF and generated Parser and Lexer.
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
package de.platon42.intellij.plugins.m68k;
|
||||
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.StubBuilder;
|
||||
import com.intellij.psi.stubs.DefaultStubBuilder;
|
||||
import com.intellij.psi.stubs.StubElement;
|
||||
import com.intellij.psi.tree.IStubFileElementType;
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kFile;
|
||||
import de.platon42.intellij.plugins.m68k.stubs.M68kFileStub;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class M68kFileElementType extends IStubFileElementType<M68kFileStub> {
|
||||
public static final IStubFileElementType<M68kFileStub> INSTANCE = new M68kFileElementType();
|
||||
public static final int VERSION = 1;
|
||||
|
||||
private M68kFileElementType() {
|
||||
super("M68K_FILE", M68kLanguage.Companion.getINSTANCE());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getStubVersion() {
|
||||
return VERSION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StubBuilder getBuilder() {
|
||||
return new DefaultStubBuilder() {
|
||||
|
||||
@Override
|
||||
protected @NotNull StubElement createStubForFile(@NotNull PsiFile file) {
|
||||
if (file instanceof M68kFile) return new M68kFileStub((M68kFile) file);
|
||||
return super.createStubForFile(file);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import javax.swing.Icon
|
||||
class M68kFileType private constructor() : LanguageFileType(M68kLanguage.INSTANCE, true) {
|
||||
@NonNls
|
||||
override fun getName(): String {
|
||||
return "M68k ASM File"
|
||||
return "M68k"
|
||||
}
|
||||
|
||||
override fun getDescription(): String {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
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,5 @@
|
||||
package de.platon42.intellij.plugins.m68k.lexer
|
||||
|
||||
import com.intellij.lexer.FlexAdapter
|
||||
|
||||
class M68kLexer : FlexAdapter(_M68kLexer())
|
||||
@@ -0,0 +1,135 @@
|
||||
package de.platon42.intellij.plugins.m68k.lexer;
|
||||
|
||||
import com.intellij.lexer.FlexLexer;
|
||||
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.*;
|
||||
|
||||
%%
|
||||
|
||||
%{
|
||||
public _M68kLexer() {
|
||||
this((java.io.Reader)null);
|
||||
}
|
||||
%}
|
||||
|
||||
%public
|
||||
%class _M68kLexer
|
||||
%implements FlexLexer
|
||||
%function advance
|
||||
%type IElementType
|
||||
%unicode
|
||||
|
||||
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]))
|
||||
BINARY=(%[01]+)
|
||||
HEXADECIMAL=(\$[0-9a-fA-F]+)
|
||||
OCTAL=(@[0-7]+)
|
||||
DECIMAL=([0-9]+)
|
||||
STRINGLIT=(`([^`\\]|\\.)*`|'([^'\\]|\\.)*'|\"([^\"\\]|\\.)*\")|<([^`\\]|\\.)*>
|
||||
COMMENT=(\p{Blank}*?[;*].*+)
|
||||
|
||||
%%
|
||||
<YYINITIAL> {
|
||||
{WHITE_SPACE} { return WHITE_SPACE; }
|
||||
|
||||
":" { 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; }
|
||||
|
||||
{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; }
|
||||
|
||||
}
|
||||
|
||||
[^] { return BAD_CHARACTER; }
|
||||
@@ -0,0 +1,278 @@
|
||||
{
|
||||
parserClass="de.platon42.intellij.plugins.m68k.parser.M68kParser"
|
||||
parserUtilClass="de.platon42.intellij.plugins.m68k.parser.M68kParserUtilBase"
|
||||
|
||||
extends="com.intellij.extapi.psi.ASTWrapperPsiElement"
|
||||
|
||||
psiClassPrefix="M68k"
|
||||
psiImplClassSuffix="Impl"
|
||||
psiPackage="de.platon42.intellij.plugins.m68k.psi"
|
||||
psiImplPackage="de.platon42.intellij.plugins.m68k.psi.impl"
|
||||
|
||||
// elementTypeFactory="de.platon42.intellij.plugins.m68k.parser.M68kParserDefinition.createType"
|
||||
// tokenTypeFactory="de.platon42.intellij.plugins.m68k.parser.M68kParserDefinition.createTokenType"
|
||||
|
||||
elementTypeHolderClass="de.platon42.intellij.plugins.m68k.psi.M68kTypes"
|
||||
elementTypeClass="de.platon42.intellij.plugins.m68k.psi.M68kElementType"
|
||||
tokenTypeClass="de.platon42.intellij.plugins.m68k.psi.M68kTokenType"
|
||||
|
||||
name(".*_expr")='expression'
|
||||
extends(".*_expr")=expr
|
||||
|
||||
name(".*AddressingMode")='AddressingMode'
|
||||
extends(".*AddressingMode")=AddressingMode
|
||||
|
||||
name(".*Register")='Register'
|
||||
|
||||
consumeTokenMethod(".*_expr|expr|.*AddressingMode")="consumeTokenFast"
|
||||
|
||||
tokens = [
|
||||
EOL = 'regexp:\R'
|
||||
WHITE_SPACE = 'regexp:\p{Blank}+'
|
||||
|
||||
EQU = 'regexp:([eE][qQ][uU])'
|
||||
|
||||
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])'
|
||||
|
||||
INCLUDE_TAG = 'regexp:((\p{Blank}+)?[iI][nN][cC][lL][uU][dD][eE])'
|
||||
INCBIN_TAG = 'regexp:((\p{Blank}+)?[iI][nN][cC][bB][iI][nN])'
|
||||
|
||||
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]).*'
|
||||
|
||||
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])'
|
||||
|
||||
// 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}|_)*::?)'
|
||||
|
||||
// MNEMONIC = 'regexp:((\p{Alpha})+)'
|
||||
SYMBOL = 'regexp:((\p{Alpha}|_)(\p{Alnum}|_)*)'
|
||||
OPSIZE_BS = 'regexp:(\.([bB]|[sS]))'
|
||||
OPSIZE_WL = 'regexp:(\.([wW]|[lL]))'
|
||||
|
||||
BINARY = 'regexp:(%[01]+)'
|
||||
HEXADECIMAL = 'regexp:(\$[0-9a-fA-F]+)'
|
||||
OCTAL = 'regexp:(@[0-7]+)'
|
||||
DECIMAL = 'regexp:([0-9]+)'
|
||||
|
||||
STRINGLIT = "regexp:(`([^`\\]|\\.)*`|'([^'\\]|\\.)*'|\"([^\"\\]|\\.)*\")|<([^`\\]|\\.)*>"
|
||||
|
||||
COLON = ':'
|
||||
SEMICOLON = ';'
|
||||
SQUARE_L = '['
|
||||
SQUARE_R = ']'
|
||||
ROUND_L = '('
|
||||
ROUND_R = ')'
|
||||
SEPARATOR = ','
|
||||
DOT = '.'
|
||||
HASH = '#'
|
||||
DOLLAR = '$'
|
||||
|
||||
OP_ASSIGN = '='
|
||||
|
||||
OP_UNARY_NOT = '!'
|
||||
OP_UNARY_COMPL = '~'
|
||||
|
||||
OP_PLUS = '+'
|
||||
OP_MINUS = '-'
|
||||
OP_AR_MUL = '*'
|
||||
OP_AR_DIV = '/'
|
||||
OP_AR_MOD = '%'
|
||||
OP_AR_SHIFT_L = '<<'
|
||||
OP_AR_SHIFT_R = '>>'
|
||||
OP_BITWISE_AND = '&'
|
||||
OP_BITWISE_OR = '|'
|
||||
OP_BITWISE_XOR = '^'
|
||||
OP_LOGICAL_AND = '&&'
|
||||
OP_LOGICAL_OR = '||'
|
||||
|
||||
OP_CMP_EQ = '=='
|
||||
OP_CMP_LT = '<'
|
||||
OP_CMP_GT = '>'
|
||||
OP_CMP_GT_EQ = '>='
|
||||
OP_CMP_LT_EQ = '<='
|
||||
OP_CMP_NOT_EQ = '!='
|
||||
OP_CMP_NOT_EQ2 = '<>'
|
||||
|
||||
COMMENT = 'regexp:(\p{Blank}*?[;*].*+)'//|(!\s#+.*+)'
|
||||
// EOL_COMMENT = 'regexp:((\p{Blank}+;.*?)|(\p{Blank}+\.*+))'
|
||||
]
|
||||
}
|
||||
|
||||
M68kFile ::= line*
|
||||
|
||||
private BlankLine ::= WHITE_SPACE?
|
||||
|
||||
private line ::= !<<eof>> statement EOL
|
||||
|
||||
statement ::= (Assignment
|
||||
| PreprocessorDirective
|
||||
| LabelInsts
|
||||
| BlankLine)
|
||||
{pin=1 recoverWhile=statement_recover};
|
||||
|
||||
private statement_recover ::= !(EOL)
|
||||
|
||||
Assignment ::= SYMBOL ((WHITE_SPACE? OP_ASSIGN WHITE_SPACE?)|(WHITE_SPACE EQU WHITE_SPACE)) expr
|
||||
|
||||
private LabelInsts ::= LabelOnly|LabelWithInstruction|InstructionOnly
|
||||
|
||||
private LabelOnly ::= Label
|
||||
private LabelWithInstruction ::= Label WHITE_SPACE Instruction
|
||||
private InstructionOnly ::= WHITE_SPACE 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}
|
||||
Label ::= LocalLabel | GlobalLabel
|
||||
|
||||
OperandSize ::= (OPSIZE_BS|OPSIZE_WL)
|
||||
AddressSize ::= OPSIZE_WL
|
||||
DataWidth ::= OPSIZE_WL
|
||||
|
||||
AsmOp ::= SYMBOL OperandSize?
|
||||
|
||||
PreprocessorDirective ::= SYMBOL?
|
||||
(END_TAG
|
||||
| EVEN_TAG
|
||||
| CNOP_TAG
|
||||
| SECTION_TAG
|
||||
| INCLUDE_TAG
|
||||
| INCBIN_TAG
|
||||
| IF_TAG
|
||||
| ELSE_TAG
|
||||
| ENDC_TAG
|
||||
| MACRO_TAG
|
||||
| MACRO_END_TAG
|
||||
| REPT_TAG
|
||||
| REPT_END_TAG
|
||||
| FAIL_TAG)
|
||||
(WHITE_SPACE PreprocessorOperands)?
|
||||
|
||||
MacroCall ::= SYMBOL PreprocessorOperands?
|
||||
AsmInstruction ::= AsmOp (WHITE_SPACE AsmOperands)?
|
||||
//Instruction ::= AsmInstruction | MacroCall
|
||||
external Instruction ::= parseMacroCallOrAsmInstruction
|
||||
|
||||
AsmOperands ::= FirstAsmOperand (SEPARATOR NextAsmOperand)*
|
||||
|
||||
private FirstAsmOperand ::= AddressingMode
|
||||
|
||||
private NextAsmOperand ::= AddressingMode
|
||||
|
||||
private PreprocessorOperands ::= PreprocessorOperand (SEPARATOR PreprocessorOperand)*
|
||||
|
||||
private PreprocessorOperand ::= expr
|
||||
|
||||
DataRegister ::= DREG {extends=Register}
|
||||
AddressRegister ::= AREG {extends=Register}
|
||||
SpecialRegister ::= REG_CCR | REG_SR | REG_USP | REG_VBR {extends=Register}
|
||||
|
||||
Register ::= DataRegister | AddressRegister | SpecialRegister
|
||||
|
||||
private DataOrAddressRegister ::= DataRegister | AddressRegister
|
||||
|
||||
AddressingMode ::= AbsoluteAddressAddressingMode
|
||||
| SpecialRegisterDirectAddressingMode
|
||||
| DataRegisterDirectAddressingMode
|
||||
| AddressRegisterDirectAddressingMode
|
||||
| AddressRegisterIndirectAddressingMode
|
||||
| AddressRegisterIndirectWithDisplacementOldAddressingMode
|
||||
| ProgramCounterIndirectWithDisplacementOldAddressingMode
|
||||
| AddressRegisterIndirectWithIndexOldAddressingMode
|
||||
| ProgramCounterIndirectWithIndexOldAddressingMode
|
||||
| AddressRegisterIndirectWithDisplacementNewAddressingMode
|
||||
| ProgramCounterIndirectWithDisplacementNewAddressingMode
|
||||
| AddressRegisterIndirectWithIndexNewAddressingMode
|
||||
| ProgramCounterIndirectWithIndexNewAddressingMode
|
||||
| AddressRegisterIndirectPreDecAddressingMode
|
||||
| AddressRegisterIndirectPostIncAddressingMode
|
||||
| ImmediateData
|
||||
|
||||
SpecialRegisterDirectAddressingMode ::= SpecialRegister
|
||||
DataRegisterDirectAddressingMode ::= DataRegister
|
||||
AddressRegisterDirectAddressingMode ::= AddressRegister
|
||||
AddressRegisterIndirectAddressingMode ::= ROUND_L AddressRegister ROUND_R !OP_PLUS
|
||||
AddressRegisterIndirectPostIncAddressingMode ::= ROUND_L AddressRegister ROUND_R OP_PLUS
|
||||
AddressRegisterIndirectPreDecAddressingMode ::= OP_MINUS ROUND_L AddressRegister ROUND_R
|
||||
AddressRegisterIndirectWithDisplacementOldAddressingMode ::= expr ROUND_L AddressRegister ROUND_R
|
||||
AddressRegisterIndirectWithDisplacementNewAddressingMode ::= ROUND_L expr SEPARATOR AddressRegister ROUND_R
|
||||
AddressRegisterIndirectWithIndexOldAddressingMode ::= expr ROUND_L AddressRegister SEPARATOR DataOrAddressRegister DataWidth? ROUND_R
|
||||
AddressRegisterIndirectWithIndexNewAddressingMode ::= ROUND_L expr SEPARATOR AddressRegister SEPARATOR DataOrAddressRegister DataWidth? ROUND_R
|
||||
ProgramCounterIndirectWithDisplacementOldAddressingMode ::= expr ROUND_L PC ROUND_R
|
||||
ProgramCounterIndirectWithDisplacementNewAddressingMode ::= ROUND_L expr SEPARATOR PC ROUND_R
|
||||
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
|
||||
ImmediateData ::= HASH expr {extends=AddressingMode}
|
||||
|
||||
expr ::= binary_logical_or_expr
|
||||
| binary_logical_and_expr
|
||||
| binary_cmp_eq_ne_group
|
||||
| binary_cmp_diff_group
|
||||
| binary_addsub_group
|
||||
| binary_muldiv_group
|
||||
| binary_bitwise_or_expr
|
||||
| binary_bitwise_xor_expr
|
||||
| binary_bitwise_and_expr
|
||||
| binary_shift_group
|
||||
| unary_group
|
||||
| primary_group
|
||||
// | macrobrace_expr
|
||||
|
||||
// private rules to define operators with the same priority
|
||||
private unary_group ::= unary_plus_expr|unary_minus_expr|unary_not_expr|unary_compl_expr
|
||||
private binary_shift_group ::= binary_shift_l_expr|binary_shift_r_expr
|
||||
private binary_muldiv_group ::= binary_mul_expr|binary_div_expr|binary_mod_expr
|
||||
private binary_addsub_group ::= binary_add_expr|binary_sub_expr
|
||||
private binary_cmp_diff_group ::= binary_cmp_lt_expr|binary_cmp_le_expr|binary_cmp_gt_expr|binary_cmp_ge_expr
|
||||
private binary_cmp_eq_ne_group ::= binary_cmp_eq_expr|binary_cmp_ne_expr
|
||||
private primary_group ::= ref_expr|literal_expr|paren_expr
|
||||
|
||||
unary_plus_expr ::= OP_PLUS expr
|
||||
unary_minus_expr ::= OP_MINUS expr
|
||||
unary_not_expr ::= OP_UNARY_NOT expr
|
||||
unary_compl_expr ::= OP_UNARY_COMPL expr
|
||||
binary_shift_l_expr ::= expr OP_AR_SHIFT_L expr
|
||||
binary_shift_r_expr ::= expr OP_AR_SHIFT_R expr
|
||||
binary_bitwise_and_expr ::= expr OP_BITWISE_AND expr
|
||||
binary_bitwise_xor_expr ::= expr OP_BITWISE_XOR expr
|
||||
binary_bitwise_or_expr ::= expr (OP_BITWISE_OR|OP_UNARY_NOT) expr
|
||||
binary_mul_expr ::= expr OP_AR_MUL expr
|
||||
binary_div_expr ::= expr OP_AR_DIV expr
|
||||
binary_mod_expr ::= expr OP_AR_MOD expr
|
||||
binary_add_expr ::= expr OP_PLUS expr
|
||||
binary_sub_expr ::= expr OP_MINUS expr
|
||||
binary_cmp_lt_expr ::= expr OP_CMP_LT expr
|
||||
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_logical_and_expr ::= expr OP_LOGICAL_AND expr
|
||||
binary_logical_or_expr ::= expr OP_LOGICAL_OR expr
|
||||
|
||||
//macrobrace_expr ::= OP_CMP_LT expr OP_CMP_GT
|
||||
paren_expr ::= ROUND_L expr ROUND_R //{pin=1 recoverWhile=statement_recover}
|
||||
ref_expr ::= SYMBOL
|
||||
literal_expr ::= BINARY|DECIMAL|HEXADECIMAL|OCTAL|STRINGLIT
|
||||
@@ -0,0 +1,66 @@
|
||||
package de.platon42.intellij.plugins.m68k.parser;
|
||||
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.lang.ParserDefinition;
|
||||
import com.intellij.lang.PsiParser;
|
||||
import com.intellij.lexer.Lexer;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.FileViewProvider;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.tree.IFileElementType;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
import de.platon42.intellij.plugins.m68k.M68kFileElementType;
|
||||
import de.platon42.intellij.plugins.m68k.lexer.M68kLexer;
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kFile;
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kTypes;
|
||||
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() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Lexer createLexer(Project project) {
|
||||
return new M68kLexer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull PsiParser createParser(Project project) {
|
||||
return new M68kParser();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull IFileElementType getFileNodeType() {
|
||||
return M68kFileElementType.INSTANCE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public @NotNull TokenSet getWhitespaceTokens() {
|
||||
// return WHITE_SPACE;
|
||||
// }
|
||||
|
||||
@Override
|
||||
public @NotNull TokenSet getCommentTokens() {
|
||||
return COMMENTS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull TokenSet getStringLiteralElements() {
|
||||
return STRING_LITERALS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull PsiElement createElement(ASTNode node) {
|
||||
return M68kTypes.Factory.createElement(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull PsiFile createFile(@NotNull FileViewProvider viewProvider) {
|
||||
return new M68kFile(viewProvider);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package de.platon42.intellij.plugins.m68k.parser;
|
||||
|
||||
import com.intellij.lang.PsiBuilder;
|
||||
import com.intellij.lang.parser.GeneratedParserUtilBase;
|
||||
|
||||
import static de.platon42.intellij.plugins.m68k.psi.M68kTypes.SYMBOL;
|
||||
|
||||
public class M68kParserUtilBase extends GeneratedParserUtilBase {
|
||||
|
||||
public static boolean parseMacroCallOrAsmInstruction(PsiBuilder b, int level) {
|
||||
boolean r = false;
|
||||
if (!nextTokenIs(b, SYMBOL)) return M68kParser.MacroCall(b, level);
|
||||
|
||||
PsiBuilder.Marker m = enter_section_(b);
|
||||
|
||||
//M68kMnemonics.INSTANCE.getMnemonics().stream().findFirst() nextTokenIs(, )
|
||||
r = M68kParser.AsmInstruction(b, level);
|
||||
|
||||
exit_section_(b, m, null, r);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package de.platon42.intellij.plugins.m68k.psi
|
||||
|
||||
import com.intellij.extapi.psi.PsiFileBase
|
||||
import com.intellij.psi.FileViewProvider
|
||||
import de.platon42.intellij.plugins.m68k.M68kFileType
|
||||
import de.platon42.intellij.plugins.m68k.M68kLanguage
|
||||
|
||||
class M68kFile(private val fileViewProvider: FileViewProvider) : PsiFileBase(fileViewProvider, M68kLanguage.INSTANCE) {
|
||||
override fun toString(): String {
|
||||
val virtualFile = if (fileViewProvider.isEventSystemEnabled) fileViewProvider.virtualFile else null
|
||||
return "Assembly File: " + (virtualFile?.name ?: "<unknown>")
|
||||
}
|
||||
|
||||
override fun getFileType() = M68kFileType.INSTANCE
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package de.platon42.intellij.plugins.m68k.stubs
|
||||
|
||||
import com.intellij.psi.stubs.PsiFileStubImpl
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kFile
|
||||
|
||||
class M68kFileStub(file: M68kFile?) : PsiFileStubImpl<M68kFile?>(file)
|
||||
Reference in New Issue
Block a user