fixed assignment to a[i]^^

This commit is contained in:
Irmen de Jong
2025-07-06 08:56:31 +02:00
parent e14c3f8b59
commit b4e0a2019e
9 changed files with 84 additions and 46 deletions

View File

@@ -603,7 +603,9 @@ class Antlr2KotlinVisitor(val source: SourceCode): AbstractParseTreeVisitor<Node
override fun visitPointerDereferenceTarget(ctx: PointerDereferenceTargetContext): AssignTarget {
val deref = ctx.pointerdereference().accept(this)
return if(deref is PtrDereference)
AssignTarget(null, null, null, null, false, deref, deref.position)
AssignTarget(null, null, null, null, false, deref, null, deref.position)
else if(deref is ArrayIndexedPtrDereference)
AssignTarget(null, null, null, null, false, null, deref, deref.position)
else
throw SyntaxError("no support for dereferencing after array indexing yet. (Split the assignment using an intermediate variable?)", ctx.toPosition())
}

View File

@@ -595,6 +595,7 @@ data class AssignTarget(
val multi: List<AssignTarget>?,
val void: Boolean,
var pointerDereference: PtrDereference? = null,
var arrayIndexedDereference: ArrayIndexedPtrDereference? = null,
override val position: Position
) : Node {
override lateinit var parent: Node
@@ -605,6 +606,7 @@ data class AssignTarget(
arrayindexed?.linkParents(this)
memoryAddress?.linkParents(this)
pointerDereference?.linkParents(this)
arrayIndexedDereference?.linkParents(this)
multi?.forEach { it.linkParents(this) }
}
@@ -659,6 +661,7 @@ data class AssignTarget(
multi?.toList(),
void,
pointerDereference?.copy(),
arrayIndexedDereference?.copy(),
position
)
override fun referencesIdentifier(nameInSource: List<String>): Boolean =
@@ -666,6 +669,7 @@ data class AssignTarget(
arrayindexed?.referencesIdentifier(nameInSource)==true ||
memoryAddress?.referencesIdentifier(nameInSource)==true ||
pointerDereference?.referencesIdentifier(nameInSource)==true ||
arrayIndexedDereference?.referencesIdentifier(nameInSource)==true ||
multi?.any { it.referencesIdentifier(nameInSource)}==true
fun inferType(program: Program): InferredTypes.InferredType {
@@ -678,6 +682,7 @@ data class AssignTarget(
arrayindexed != null -> arrayindexed!!.inferType(program)
memoryAddress != null -> InferredTypes.knownFor(BaseDataType.UBYTE)
pointerDereference != null -> pointerDereference!!.inferType(program)
arrayIndexedDereference != null -> arrayIndexedDereference!!.inferType(program)
else -> InferredTypes.unknown() // a multi-target has no 1 particular type
}
}
@@ -690,6 +695,7 @@ data class AssignTarget(
memoryAddress != null -> DirectMemoryRead(memoryAddress!!.addressExpression.copy(), memoryAddress!!.position)
multi != null -> throw FatalAstException("cannot turn a multi-assign into a single source expression")
pointerDereference != null -> pointerDereference!!.copy()
arrayIndexedDereference != null -> arrayIndexedDereference!!.copy()
else -> throw FatalAstException("invalid assignment target")
}
}
@@ -711,6 +717,11 @@ data class AssignTarget(
pointerDereference!!.chain==value.chain
} else false
}
arrayIndexedDereference != null -> {
return if (value is ArrayIndexedPtrDereference) {
arrayIndexedDereference!!.chain==value.chain && arrayIndexedDereference!!.derefLast==value.derefLast
} else false
}
else -> false
}
}
@@ -739,6 +750,9 @@ data class AssignTarget(
pointerDereference !=null && other.pointerDereference !=null -> {
return pointerDereference!! isSameAs other.pointerDereference!!
}
arrayIndexedDereference !=null && other.arrayIndexedDereference !=null -> {
return arrayIndexedDereference!! isSameAs other.arrayIndexedDereference!!
}
this.multi != null && other.multi != null -> return this.multi == other.multi
else -> return false
}

View File

@@ -450,6 +450,7 @@ abstract class AstWalker {
assignTarget.identifier?.accept(this, assignTarget)
assignTarget.memoryAddress?.accept(this, assignTarget)
assignTarget.pointerDereference?.accept(this, assignTarget)
assignTarget.arrayIndexedDereference?.accept(this, assignTarget)
assignTarget.multi?.forEach { it.accept(this, assignTarget) }
track(after(assignTarget, parent), assignTarget, parent)
}

View File

@@ -162,6 +162,7 @@ interface IAstVisitor {
assignTarget.identifier?.accept(this)
assignTarget.memoryAddress?.accept(this)
assignTarget.pointerDereference?.accept(this)
assignTarget.arrayIndexedDereference?.accept(this)
assignTarget.multi?.forEach { it.accept(this) }
}