Simplify code generation using overridden AST methods.

This commit is contained in:
Deryck Brown
2022-05-23 21:39:42 +01:00
parent fbada163d4
commit a6a078680c
15 changed files with 105 additions and 85 deletions
@@ -30,4 +30,14 @@ public class CharacterExpression extends Expression {
}
public final CharacterLiteral CL;
@Override
public boolean isLiteral() {
return true;
}
@Override
public int getValue() {
return CL.getValue();
}
}
@@ -28,6 +28,14 @@ public abstract class Expression extends AbstractSyntaxTree {
public TypeDenoter type;
public boolean isLiteral() {
return false;
}
public int getValue() {
throw new UnsupportedOperationException();
}
public abstract <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> visitor, TArg arg);
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> visitor) {
@@ -30,4 +30,14 @@ public class IntegerExpression extends Expression {
}
public final IntegerLiteral IL;
@Override
public boolean isLiteral() {
return true;
}
@Override
public int getValue() {
return IL.getValue();
}
}
@@ -31,4 +31,9 @@ public class AnyTypeDenoter extends TypeDenoter {
public boolean equals(Object obj) {
return false;
}
@Override
public int getSize() {
return 0;
}
}
@@ -41,6 +41,11 @@ public class ArrayTypeDenoter extends TypeDenoter {
return false;
}
}
@Override
public int getSize() {
return IL.getValue() * T.getSize();
}
public final IntegerLiteral IL;
public TypeDenoter T;
@@ -14,6 +14,7 @@
package triangle.abstractSyntaxTrees.types;
import triangle.abstractMachine.Machine;
import triangle.abstractSyntaxTrees.visitors.TypeDenoterVisitor;
import triangle.syntacticAnalyzer.SourcePosition;
@@ -26,6 +27,11 @@ public class BoolTypeDenoter extends TypeDenoter {
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
return v.visitBoolTypeDenoter(this, arg);
}
@Override
public int getSize() {
return Machine.booleanSize;
}
@Override
public boolean equals(Object obj) {
@@ -14,6 +14,7 @@
package triangle.abstractSyntaxTrees.types;
import triangle.abstractMachine.Machine;
import triangle.abstractSyntaxTrees.visitors.TypeDenoterVisitor;
import triangle.syntacticAnalyzer.SourcePosition;
@@ -26,6 +27,11 @@ public class CharTypeDenoter extends TypeDenoter {
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
return v.visitCharTypeDenoter(this, arg);
}
@Override
public int getSize() {
return Machine.characterSize;
}
@Override
public boolean equals(Object obj) {
@@ -27,6 +27,11 @@ public class ErrorTypeDenoter extends TypeDenoter {
return v.visitErrorTypeDenoter(this, arg);
}
@Override
public int getSize() {
return 0;
}
@Override
public boolean equals(Object obj) {
return true;
@@ -14,6 +14,7 @@
package triangle.abstractSyntaxTrees.types;
import triangle.abstractMachine.Machine;
import triangle.abstractSyntaxTrees.visitors.TypeDenoterVisitor;
import triangle.syntacticAnalyzer.SourcePosition;
@@ -26,6 +27,11 @@ public class IntTypeDenoter extends TypeDenoter {
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
return v.visitIntTypeDenoter(this, arg);
}
@Override
public int getSize() {
return Machine.integerSize;
}
@Override
public boolean equals(Object obj) {
@@ -31,6 +31,11 @@ public class MultipleFieldTypeDenoter extends FieldTypeDenoter {
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
return v.visitMultipleFieldTypeDenoter(this, arg);
}
@Override
public int getSize() {
return T.getSize() + FT.getSize();
}
@Override
public boolean equals(Object obj) {
@@ -27,6 +27,11 @@ public class RecordTypeDenoter extends TypeDenoter {
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
return v.visitRecordTypeDenoter(this, arg);
}
@Override
public int getSize() {
return FT.getSize();
}
@Override
public boolean equals(Object obj) {
@@ -28,6 +28,11 @@ public class SimpleTypeDenoter extends TypeDenoter {
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
return v.visitSimpleTypeDenoter(this, arg);
}
@Override
public int getSize() {
return 0;
}
@Override
public boolean equals(Object obj) {
@@ -29,6 +29,11 @@ public class SingleFieldTypeDenoter extends FieldTypeDenoter {
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
return v.visitSingleFieldTypeDenoter(this, arg);
}
@Override
public int getSize() {
return T.getSize();
}
@Override
public boolean equals(Object obj) {
@@ -32,4 +32,6 @@ public abstract class TypeDenoter extends AbstractSyntaxTree {
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> visitor) {
return visit(visitor, null);
}
public abstract int getSize();
}