258 lines
11 KiB
BNF

{
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 = 'equ'
//
// EVEN_TAG = 'even'
// CNOP_TAG = 'cnop'
// SECTION_TAG = 'section'
//
// INCLUDE_TAG = 'include'
// INCBIN_TAG = 'incbin'
//
// 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:((a[0-7])|sp)'
// DREG = 'regexp:(d[0-7])'
// PC = 'pc'
// REG_CCR = 'ccr'
// REG_SR = 'sr'
// REG_USP = 'usp'
// REG_VBR = 'vbr'
// 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})+)'
// SYMBOL = 'regexp:((\p{Alpha}|_)(\p{Alnum}|_)*)'
// OPSIZE_BS = 'regexp:(\.[bs])'
// OPSIZE_WL = 'regexp:(\.[wl])'
// BINARY = 'regexp:(%[01]+)'
// HEXADECIMAL = 'regexp:(\$[0-9a-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 line ::= !<<eof>> statement EOL
statement ::= (Assignment
| PreprocessorDirective
| LabelInsts)
{pin=1 recoverWhile=statement_recover};
private statement_recover ::= !(EOL)
Assignment ::= SYMBOLDEF (OP_ASSIGN|EQU) expr
private LabelInsts ::= LabelWithInstruction | LabelOnly | InstructionOnly
private LabelOnly ::= Label
private LabelWithInstruction ::= Label Instruction
private InstructionOnly ::= Instruction
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 ::= MNEMONIC OperandSize?
PreprocessorDirective ::= Label? (DATA_DIRECTIVE | OTHER_DIRECTIVE)
PreprocessorOperands?
MacroCall ::= MACRO_INVOKATION PlainOperands?
AsmInstruction ::= AsmOp AsmOperands?
private Instruction ::= AsmInstruction | MacroCall
//external Instruction ::= parseMacroCallOrAsmInstruction
private AsmOperands ::= AddressingMode (SEPARATOR AddressingMode)?
private PreprocessorOperands ::= PreprocessorOperand (SEPARATOR PreprocessorOperand)*
private PreprocessorOperand ::= expr
private PlainOperands ::= STRINGLIT (SEPARATOR STRINGLIT)*
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 ::= ImmediateData
| AddressRegisterIndirectPreDecAddressingMode
| AddressRegisterIndirectPostIncAddressingMode
| AddressRegisterIndirectAddressingMode
| AddressRegisterIndirectWithDisplacementNewAddressingMode
| ProgramCounterIndirectWithDisplacementNewAddressingMode
| AddressRegisterIndirectWithIndexNewAddressingMode
| ProgramCounterIndirectWithIndexNewAddressingMode
| AddressRegisterIndirectWithDisplacementOldAddressingMode
| ProgramCounterIndirectWithDisplacementOldAddressingMode
| AddressRegisterIndirectWithIndexOldAddressingMode
| ProgramCounterIndirectWithIndexOldAddressingMode
| SpecialRegisterDirectAddressingMode
| DataRegisterDirectAddressingMode
| AddressRegisterDirectAddressingMode
| RegisterListAddressingMode
| AbsoluteAddressAddressingMode
SpecialRegisterDirectAddressingMode ::= SpecialRegister
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
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 ::= (ROUND_L PC ROUND_R) | (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
private RegisterRange ::= (DataOrAddressRegister OP_MINUS DataOrAddressRegister)
RegisterListAddressingMode ::= (DataOrAddressRegister|RegisterRange) ((OP_AR_DIV|OP_MINUS) (DataOrAddressRegister|RegisterRange))*
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 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