diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ConstDeclaration.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ConstDeclaration.java index ab8ea2c..4cca112 100644 --- a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ConstDeclaration.java +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ConstDeclaration.java @@ -16,10 +16,11 @@ package triangle.abstractSyntaxTrees.declarations; import triangle.abstractSyntaxTrees.expressions.Expression; import triangle.abstractSyntaxTrees.terminals.Identifier; +import triangle.abstractSyntaxTrees.types.TypeDenoter; import triangle.abstractSyntaxTrees.visitors.DeclarationVisitor; import triangle.syntacticAnalyzer.SourcePosition; -public class ConstDeclaration extends Declaration { +public class ConstDeclaration extends Declaration implements ConstantDeclaration { public ConstDeclaration(Identifier iAST, Expression eAST, SourcePosition position) { super(position); @@ -27,6 +28,11 @@ public class ConstDeclaration extends Declaration { E = eAST; } + @Override + public TypeDenoter getType() { + return E.type; + } + public TResult visit(DeclarationVisitor v, TArg arg) { return v.visitConstDeclaration(this, arg); } diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ConstantDeclaration.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ConstantDeclaration.java new file mode 100644 index 0000000..5241bfc --- /dev/null +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ConstantDeclaration.java @@ -0,0 +1,9 @@ +package triangle.abstractSyntaxTrees.declarations; + +import triangle.abstractSyntaxTrees.types.TypeDenoter; + +public interface ConstantDeclaration { + + TypeDenoter getType(); + +} diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/FuncDeclaration.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/FuncDeclaration.java index 255acaa..cc49eb5 100644 --- a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/FuncDeclaration.java +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/FuncDeclaration.java @@ -21,7 +21,7 @@ import triangle.abstractSyntaxTrees.types.TypeDenoter; import triangle.abstractSyntaxTrees.visitors.DeclarationVisitor; import triangle.syntacticAnalyzer.SourcePosition; -public class FuncDeclaration extends Declaration { +public class FuncDeclaration extends Declaration implements FunctionDeclaration { public FuncDeclaration(Identifier iAST, FormalParameterSequence fpsAST, TypeDenoter tAST, Expression eAST, SourcePosition position) { @@ -36,6 +36,16 @@ public class FuncDeclaration extends Declaration { return v.visitFuncDeclaration(this, arg); } + @Override + public FormalParameterSequence getFormals() { + return FPS; + } + + @Override + public TypeDenoter getType() { + return T; + } + public final Identifier I; public final FormalParameterSequence FPS; public TypeDenoter T; diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/FunctionDeclaration.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/FunctionDeclaration.java new file mode 100644 index 0000000..425fd7c --- /dev/null +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/FunctionDeclaration.java @@ -0,0 +1,12 @@ +package triangle.abstractSyntaxTrees.declarations; + +import triangle.abstractSyntaxTrees.formals.FormalParameterSequence; +import triangle.abstractSyntaxTrees.types.TypeDenoter; + +public interface FunctionDeclaration { + + FormalParameterSequence getFormals(); + + TypeDenoter getType(); + +} diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ProcDeclaration.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ProcDeclaration.java index 171d6e7..ba925af 100644 --- a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ProcDeclaration.java +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ProcDeclaration.java @@ -20,7 +20,7 @@ import triangle.abstractSyntaxTrees.terminals.Identifier; import triangle.abstractSyntaxTrees.visitors.DeclarationVisitor; import triangle.syntacticAnalyzer.SourcePosition; -public class ProcDeclaration extends Declaration { +public class ProcDeclaration extends Declaration implements ProcedureDeclaration { public ProcDeclaration(Identifier iAST, FormalParameterSequence fpsAST, Command cAST, SourcePosition position) { super(position); @@ -33,6 +33,11 @@ public class ProcDeclaration extends Declaration { return v.visitProcDeclaration(this, arg); } + @Override + public FormalParameterSequence getFormals() { + return FPS; + } + public final Identifier I; public final FormalParameterSequence FPS; public final Command C; diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ProcedureDeclaration.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ProcedureDeclaration.java new file mode 100644 index 0000000..94dee6f --- /dev/null +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/ProcedureDeclaration.java @@ -0,0 +1,9 @@ +package triangle.abstractSyntaxTrees.declarations; + +import triangle.abstractSyntaxTrees.formals.FormalParameterSequence; + +public interface ProcedureDeclaration { + + FormalParameterSequence getFormals(); + +} diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/VarDeclaration.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/VarDeclaration.java index eb18dce..0933c5f 100644 --- a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/VarDeclaration.java +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/VarDeclaration.java @@ -19,7 +19,7 @@ import triangle.abstractSyntaxTrees.types.TypeDenoter; import triangle.abstractSyntaxTrees.visitors.DeclarationVisitor; import triangle.syntacticAnalyzer.SourcePosition; -public class VarDeclaration extends Declaration { +public class VarDeclaration extends Declaration implements VariableDeclaration { public VarDeclaration(Identifier iAST, TypeDenoter tAST, SourcePosition position) { super(position); @@ -27,6 +27,11 @@ public class VarDeclaration extends Declaration { T = tAST; } + @Override + public TypeDenoter getType() { + return T; + } + public TResult visit(DeclarationVisitor v, TArg arg) { return v.visitVarDeclaration(this, arg); } diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/VariableDeclaration.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/VariableDeclaration.java new file mode 100644 index 0000000..4c4bfd4 --- /dev/null +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/declarations/VariableDeclaration.java @@ -0,0 +1,9 @@ +package triangle.abstractSyntaxTrees.declarations; + +import triangle.abstractSyntaxTrees.types.TypeDenoter; + +public interface VariableDeclaration { + + TypeDenoter getType(); + +} diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/ConstFormalParameter.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/ConstFormalParameter.java index 2d33926..9bd646c 100644 --- a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/ConstFormalParameter.java +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/ConstFormalParameter.java @@ -14,12 +14,13 @@ package triangle.abstractSyntaxTrees.formals; +import triangle.abstractSyntaxTrees.declarations.ConstantDeclaration; import triangle.abstractSyntaxTrees.terminals.Identifier; import triangle.abstractSyntaxTrees.types.TypeDenoter; import triangle.abstractSyntaxTrees.visitors.DeclarationVisitor; import triangle.syntacticAnalyzer.SourcePosition; -public class ConstFormalParameter extends FormalParameter { +public class ConstFormalParameter extends FormalParameter implements ConstantDeclaration { public ConstFormalParameter(Identifier iAST, TypeDenoter tAST, SourcePosition position) { super(position); @@ -27,14 +28,18 @@ public class ConstFormalParameter extends FormalParameter { T = tAST; } + @Override + public TypeDenoter getType() { + return T; + } + public TResult visit(DeclarationVisitor v, TArg arg) { return v.visitConstFormalParameter(this, arg); } @Override public boolean equals(Object fpAST) { - if (fpAST instanceof ConstFormalParameter) { - var cfpAST = (ConstFormalParameter) fpAST; + if (fpAST instanceof ConstFormalParameter cfpAST) { return T.equals(cfpAST.T); } else { return false; diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/FuncFormalParameter.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/FuncFormalParameter.java index 2c50d88..f362f25 100644 --- a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/FuncFormalParameter.java +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/FuncFormalParameter.java @@ -14,12 +14,13 @@ package triangle.abstractSyntaxTrees.formals; +import triangle.abstractSyntaxTrees.declarations.FunctionDeclaration; import triangle.abstractSyntaxTrees.terminals.Identifier; import triangle.abstractSyntaxTrees.types.TypeDenoter; import triangle.abstractSyntaxTrees.visitors.DeclarationVisitor; import triangle.syntacticAnalyzer.SourcePosition; -public class FuncFormalParameter extends FormalParameter { +public class FuncFormalParameter extends FormalParameter implements FunctionDeclaration { public FuncFormalParameter(Identifier iAST, FormalParameterSequence fpsAST, TypeDenoter tAST, SourcePosition position) { @@ -33,6 +34,16 @@ public class FuncFormalParameter extends FormalParameter { return v.visitFuncFormalParameter(this, arg); } + @Override + public FormalParameterSequence getFormals() { + return FPS; + } + + @Override + public TypeDenoter getType() { + return T; + } + @Override public boolean equals(Object fpAST) { if (fpAST instanceof FuncFormalParameter) { diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/ProcFormalParameter.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/ProcFormalParameter.java index b60015c..e89561c 100644 --- a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/ProcFormalParameter.java +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/ProcFormalParameter.java @@ -14,11 +14,12 @@ package triangle.abstractSyntaxTrees.formals; +import triangle.abstractSyntaxTrees.declarations.ProcedureDeclaration; import triangle.abstractSyntaxTrees.terminals.Identifier; import triangle.abstractSyntaxTrees.visitors.DeclarationVisitor; import triangle.syntacticAnalyzer.SourcePosition; -public class ProcFormalParameter extends FormalParameter { +public class ProcFormalParameter extends FormalParameter implements ProcedureDeclaration { public ProcFormalParameter(Identifier iAST, FormalParameterSequence fpsAST, SourcePosition position) { super(position); @@ -30,6 +31,11 @@ public class ProcFormalParameter extends FormalParameter { return v.visitProcFormalParameter(this, arg); } + @Override + public FormalParameterSequence getFormals() { + return FPS; + } + @Override public boolean equals(Object fpAST) { if (fpAST instanceof ProcFormalParameter) { diff --git a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/VarFormalParameter.java b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/VarFormalParameter.java index 7b20bf0..57cfdbc 100644 --- a/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/VarFormalParameter.java +++ b/Triangle.Compiler/src/main/java/triangle/abstractSyntaxTrees/formals/VarFormalParameter.java @@ -14,12 +14,13 @@ package triangle.abstractSyntaxTrees.formals; +import triangle.abstractSyntaxTrees.declarations.VariableDeclaration; import triangle.abstractSyntaxTrees.terminals.Identifier; import triangle.abstractSyntaxTrees.types.TypeDenoter; import triangle.abstractSyntaxTrees.visitors.DeclarationVisitor; import triangle.syntacticAnalyzer.SourcePosition; -public class VarFormalParameter extends FormalParameter { +public class VarFormalParameter extends FormalParameter implements VariableDeclaration { public VarFormalParameter(Identifier iAST, TypeDenoter tAST, SourcePosition position) { super(position); @@ -27,14 +28,18 @@ public class VarFormalParameter extends FormalParameter { T = tAST; } + @Override + public TypeDenoter getType() { + return T; + } + public TResult visit(DeclarationVisitor v, TArg arg) { return v.visitVarFormalParameter(this, arg); } @Override public boolean equals(Object fpAST) { - if (fpAST instanceof VarFormalParameter) { - VarFormalParameter vfpAST = (VarFormalParameter) fpAST; + if (fpAST instanceof VarFormalParameter vfpAST) { return T.equals(vfpAST.T); } else { return false; diff --git a/Triangle.Compiler/src/main/java/triangle/contextualAnalyzer/Checker.java b/Triangle.Compiler/src/main/java/triangle/contextualAnalyzer/Checker.java index f58f330..9a9f5b2 100644 --- a/Triangle.Compiler/src/main/java/triangle/contextualAnalyzer/Checker.java +++ b/Triangle.Compiler/src/main/java/triangle/contextualAnalyzer/Checker.java @@ -16,6 +16,7 @@ package triangle.contextualAnalyzer; import triangle.ErrorReporter; import triangle.StdEnvironment; +import triangle.abstractSyntaxTrees.AbstractSyntaxTree; import triangle.abstractSyntaxTrees.Program; import triangle.abstractSyntaxTrees.actuals.ConstActualParameter; import triangle.abstractSyntaxTrees.actuals.EmptyActualParameterSequence; @@ -37,12 +38,16 @@ import triangle.abstractSyntaxTrees.commands.SequentialCommand; import triangle.abstractSyntaxTrees.commands.WhileCommand; import triangle.abstractSyntaxTrees.declarations.BinaryOperatorDeclaration; import triangle.abstractSyntaxTrees.declarations.ConstDeclaration; +import triangle.abstractSyntaxTrees.declarations.ConstantDeclaration; import triangle.abstractSyntaxTrees.declarations.Declaration; import triangle.abstractSyntaxTrees.declarations.FuncDeclaration; +import triangle.abstractSyntaxTrees.declarations.FunctionDeclaration; import triangle.abstractSyntaxTrees.declarations.ProcDeclaration; +import triangle.abstractSyntaxTrees.declarations.ProcedureDeclaration; import triangle.abstractSyntaxTrees.declarations.SequentialDeclaration; import triangle.abstractSyntaxTrees.declarations.UnaryOperatorDeclaration; import triangle.abstractSyntaxTrees.declarations.VarDeclaration; +import triangle.abstractSyntaxTrees.declarations.VariableDeclaration; import triangle.abstractSyntaxTrees.expressions.ArrayExpression; import triangle.abstractSyntaxTrees.expressions.BinaryExpression; import triangle.abstractSyntaxTrees.expressions.CallExpression; @@ -117,29 +122,20 @@ public final class Checker implements ActualParameterVisitor