Enhanced expression parser for PC relative symbol and modulo handling and bitwise or.

This commit is contained in:
2021-07-16 10:03:33 +02:00
parent e33470ea1a
commit b7f655745b
15 changed files with 728 additions and 258 deletions
@@ -18,6 +18,11 @@ internal class AssignmentTest : AbstractParsingTest() {
testGoodSyntax(testCase, "FOO=123+10\n")
}
@Test
internal fun assignment_with_local_label(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO=.local-.bar\n")
}
@Test
internal fun assignment_via_equ(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO equ BAR\n")
@@ -0,0 +1,46 @@
package de.platon42.intellij.plugins.m68k.parser
import de.platon42.intellij.jupiter.MyTestCase
import de.platon42.intellij.jupiter.ParsingTestExtension
import de.platon42.intellij.jupiter.TestDataSubPath
import org.junit.jupiter.api.Test
@TestDataSubPath("expressions")
internal class ExpressionsTest : AbstractParsingTest() {
@Test
internal fun pure_decimal_number_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = 10\n")
}
@Test
internal fun pure_hexadecimal_number_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = $1234\n")
}
@Test
internal fun pure_octal_number_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = @777\n")
}
@Test
internal fun pure_binary_number_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = %11001100\n")
}
@Test
internal fun pure_string_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = 'string'\n"
+ "FOO=\"bar\"\n")
}
@Test
internal fun math_expression(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = -(~(!!(+(1//~WIDTH^@123+3*4/2+(NARF%10|32!21))<<2)>>1)&$1f)\n")
}
@Test
internal fun current_pc_symbol_relative_expression(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, " dc.w *-.label\n")
}
}
@@ -0,0 +1,12 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
M68kBinarySubExprImpl(BINARY_SUB_EXPR)
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('.local')
PsiElement(M68kTokenType.OP_MINUS)('-')
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('.bar')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,13 @@
Assembly File: a.asm
PsiWhiteSpace(' ')
M68kStatementImpl(STATEMENT)
M68kPreprocessorDirectiveImpl(PREPROCESSOR_DIRECTIVE)
PsiElement(M68kTokenType.DATA_DIRECTIVE)('dc.w')
PsiWhiteSpace(' ')
M68kBinarySubExprImpl(BINARY_SUB_EXPR)
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.CURRENT_PC_SYMBOL)('*')
PsiElement(M68kTokenType.OP_MINUS)('-')
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('.label')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,85 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kUnaryMinusExprImpl(UNARY_MINUS_EXPR)
PsiElement(M68kTokenType.OP_MINUS)('-')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryBitwiseAndExprImpl(BINARY_BITWISE_AND_EXPR)
M68kUnaryComplExprImpl(UNARY_COMPL_EXPR)
PsiElement(M68kTokenType.OP_UNARY_COMPL)('~')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryShiftRExprImpl(BINARY_SHIFT_R_EXPR)
M68kUnaryNotExprImpl(UNARY_NOT_EXPR)
PsiElement(M68kTokenType.OP_UNARY_NOT)('!')
M68kUnaryNotExprImpl(UNARY_NOT_EXPR)
PsiElement(M68kTokenType.OP_UNARY_NOT)('!')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryShiftLExprImpl(BINARY_SHIFT_L_EXPR)
M68kUnaryPlusExprImpl(UNARY_PLUS_EXPR)
PsiElement(M68kTokenType.OP_PLUS)('+')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryAddExprImpl(BINARY_ADD_EXPR)
M68kBinaryAddExprImpl(BINARY_ADD_EXPR)
M68kBinaryModExprImpl(BINARY_MOD_EXPR)
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('1')
PsiElement(M68kTokenType.OP_AR_MOD)('//')
M68kBinaryBitwiseXorExprImpl(BINARY_BITWISE_XOR_EXPR)
M68kUnaryComplExprImpl(UNARY_COMPL_EXPR)
PsiElement(M68kTokenType.OP_UNARY_COMPL)('~')
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('WIDTH')
PsiElement(M68kTokenType.OP_BITWISE_XOR)('^')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.OCTAL)('@123')
PsiElement(M68kTokenType.OP_PLUS)('+')
M68kBinaryDivExprImpl(BINARY_DIV_EXPR)
M68kBinaryMulExprImpl(BINARY_MUL_EXPR)
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('3')
PsiElement(M68kTokenType.OP_AR_MUL)('*')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('4')
PsiElement(M68kTokenType.OP_AR_DIV)('/')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('2')
PsiElement(M68kTokenType.OP_PLUS)('+')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryModExprImpl(BINARY_MOD_EXPR)
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('NARF')
PsiElement(M68kTokenType.OP_AR_MOD)('%')
M68kBinaryBitwiseOrExprImpl(BINARY_BITWISE_OR_EXPR)
M68kBinaryBitwiseOrExprImpl(BINARY_BITWISE_OR_EXPR)
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('10')
PsiElement(M68kTokenType.OP_BITWISE_OR)('|')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('32')
PsiElement(M68kTokenType.OP_BITWISE_OR)('!')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('21')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.OP_AR_SHIFT_L)('<<')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('2')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.OP_AR_SHIFT_R)('>>')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('1')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.OP_BITWISE_AND)('&')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.HEXADECIMAL)('$1f')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,10 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.BINARY)('%11001100')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,10 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('10')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,10 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.HEXADECIMAL)('$1234')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,10 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.OCTAL)('@777')
PsiElement(M68kTokenType.EOL)('\n')
@@ -0,0 +1,17 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.STRINGLIT)(''string'')
PsiElement(M68kTokenType.EOL)('\n')
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.STRINGLIT)('"bar"')
PsiElement(M68kTokenType.EOL)('\n')