summaryrefslogtreecommitdiff
path: root/Compiler/visitors/Targets.cs
diff options
context:
space:
mode:
authorMelodi <62381002+Melodi17@users.noreply.github.com>2025-08-27 21:22:55 +1000
committerMelodi <62381002+Melodi17@users.noreply.github.com>2025-08-27 21:22:55 +1000
commit634681ce2bb36cd686943102a0f071cd6a09049f (patch)
tree6710047aa231d50f57114bdd54a27c559fb20a73 /Compiler/visitors/Targets.cs
parent94ddc02e03ab942d0c881e29053e8df3d2940c30 (diff)
fixed bugs and revolutionized the universe
Diffstat (limited to 'Compiler/visitors/Targets.cs')
-rw-r--r--Compiler/visitors/Targets.cs40
1 files changed, 40 insertions, 0 deletions
diff --git a/Compiler/visitors/Targets.cs b/Compiler/visitors/Targets.cs
new file mode 100644
index 0000000..10d97f4
--- /dev/null
+++ b/Compiler/visitors/Targets.cs
@@ -0,0 +1,40 @@
+namespace Q1.Compiler.visitors;
+
+public partial class CCompilerVisitor
+{
+ private Target VisitTarget(CGrammarParser.TargetContext target)
+ {
+ Target? expressionString = this.Visit(target) as Target;
+ if (expressionString == null)
+ throw new CompilerException("Target did not return a target");
+
+ return expressionString;
+ }
+
+ public override Target VisitVariableTarget(CGrammarParser.VariableTargetContext context)
+ {
+ string varName = context.ID().GetText();
+ VariableReference reference = this.FindVariable(varName);
+
+ return new Target(reference.Type, $"[${reference.Address:X4}]", $"${reference.Address:X4}");
+ }
+
+ public override object? VisitIndexerTarget(CGrammarParser.IndexerTargetContext context)
+ {
+ Target obj = this.VisitTarget(context.obj);
+ if (obj.Type is not CTypePtr ptr)
+ throw new CompilerException("Indexer target was not a pointer!");
+
+ this.Instruction($"push {obj.Value}", "store index obj");
+
+ string indexer = this.VisitExpression(context.indexer);
+
+ this.Instruction($"mov {indexer}, V1", "store indexer");
+ this.Instruction($"pop V0", "restore index obj");
+ this.Instruction($"mul V1, {ptr.Sub.Size}", $"multiply indexer by {ptr.Sub.Size}");
+ this.Instruction($"add AX, V0", "add indexer and index obj");
+ this.Instruction($"mov AX, V0", "move to general purpose register");
+
+ return new Target(ptr.Sub, $"[V0]", $"V0");
+ }
+} \ No newline at end of file