Archived
Switch to generic visitor pattern.
This commit is contained in:
+5
-11
@@ -14,12 +14,14 @@
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
|
||||
import Triangle.CodeGenerator.RuntimeEntity;
|
||||
import Triangle.CodeGenerator.Entities.RuntimeEntity;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class AST {
|
||||
public abstract class AbstractSyntaxTree {
|
||||
|
||||
public AST(SourcePosition position) {
|
||||
private final SourcePosition position;
|
||||
|
||||
public AbstractSyntaxTree(SourcePosition position) {
|
||||
this.position = position;
|
||||
entity = null;
|
||||
}
|
||||
@@ -28,13 +30,5 @@ public abstract class AST {
|
||||
return position;
|
||||
}
|
||||
|
||||
public abstract Object visit(Visitor v, Object o);
|
||||
|
||||
public final Object visit(Visitor v) {
|
||||
return visit(v, null);
|
||||
}
|
||||
|
||||
public final SourcePosition position;
|
||||
|
||||
public RuntimeEntity entity;
|
||||
}
|
||||
+10
-2
@@ -12,13 +12,21 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class ActualParameter extends AST {
|
||||
public abstract class ActualParameter extends AbstractSyntaxTree {
|
||||
|
||||
public ActualParameter(SourcePosition position) {
|
||||
super(position);
|
||||
}
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+10
-2
@@ -12,13 +12,21 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class ActualParameterSequence extends AST {
|
||||
public abstract class ActualParameterSequence extends AbstractSyntaxTree {
|
||||
|
||||
public ActualParameterSequence(SourcePosition position) {
|
||||
super(position);
|
||||
}
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(ActualParameterSequenceVisitor<TArg, TResult> v, TArg arg);
|
||||
|
||||
public <TResult> TResult visit(ActualParameterSequenceVisitor<Void, TResult> v) {
|
||||
return visit(v, null);
|
||||
}
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class ConstActualParameter extends ActualParameter {
|
||||
@@ -23,10 +25,9 @@ public class ConstActualParameter extends ActualParameter {
|
||||
E = eAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitConstActualParameter(this, o);
|
||||
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitConstActualParameter(this, arg);
|
||||
}
|
||||
|
||||
public Expression E;
|
||||
public final Expression E;
|
||||
}
|
||||
+4
-4
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class EmptyActualParameterSequence extends ActualParameterSequence {
|
||||
@@ -22,8 +23,7 @@ public class EmptyActualParameterSequence extends ActualParameterSequence {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitEmptyActualParameterSequence(this, o);
|
||||
public <TArg, TResult> TResult visit(ActualParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitEmptyActualParameterSequence(this, arg);
|
||||
}
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class FuncActualParameter extends ActualParameter {
|
||||
@@ -23,10 +25,9 @@ public class FuncActualParameter extends ActualParameter {
|
||||
I = iAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitFuncActualParameter(this, o);
|
||||
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitFuncActualParameter(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public final Identifier I;
|
||||
}
|
||||
+6
-6
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class MultipleActualParameterSequence extends ActualParameterSequence {
|
||||
@@ -25,11 +26,10 @@ public class MultipleActualParameterSequence extends ActualParameterSequence {
|
||||
APS = apsAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitMultipleActualParameterSequence(this, o);
|
||||
public <TArg, TResult> TResult visit(ActualParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitMultipleActualParameterSequence(this, arg);
|
||||
}
|
||||
|
||||
public ActualParameter AP;
|
||||
public ActualParameterSequence APS;
|
||||
public final ActualParameter AP;
|
||||
public final ActualParameterSequence APS;
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class ProcActualParameter extends ActualParameter {
|
||||
@@ -23,10 +25,9 @@ public class ProcActualParameter extends ActualParameter {
|
||||
I = iAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitProcActualParameter(this, o);
|
||||
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitProcActualParameter(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public final Identifier I;
|
||||
}
|
||||
+5
-5
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SingleActualParameterSequence extends ActualParameterSequence {
|
||||
@@ -23,10 +24,9 @@ public class SingleActualParameterSequence extends ActualParameterSequence {
|
||||
AP = apAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSingleActualParameterSequence(this, o);
|
||||
public <TArg, TResult> TResult visit(ActualParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSingleActualParameterSequence(this, arg);
|
||||
}
|
||||
|
||||
public ActualParameter AP;
|
||||
public final ActualParameter AP;
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||
import Triangle.AbstractSyntaxTrees.Vnames.Vname;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class VarActualParameter extends ActualParameter {
|
||||
@@ -23,10 +25,9 @@ public class VarActualParameter extends ActualParameter {
|
||||
V = vAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitVarActualParameter(this, o);
|
||||
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitVarActualParameter(this, arg);
|
||||
}
|
||||
|
||||
public Vname V;
|
||||
public final Vname V;
|
||||
}
|
||||
+10
-2
@@ -12,11 +12,13 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Aggregates;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class ArrayAggregate extends AST {
|
||||
public abstract class ArrayAggregate extends AbstractSyntaxTree {
|
||||
|
||||
public ArrayAggregate(SourcePosition position) {
|
||||
super(position);
|
||||
@@ -24,4 +26,10 @@ public abstract class ArrayAggregate extends AST {
|
||||
}
|
||||
|
||||
public int elemCount;
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(ArrayAggregateVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(ArrayAggregateVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Aggregates;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class MultipleArrayAggregate extends ArrayAggregate {
|
||||
@@ -24,11 +26,10 @@ public class MultipleArrayAggregate extends ArrayAggregate {
|
||||
AA = aaAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitMultipleArrayAggregate(this, o);
|
||||
public <TArg, TResult> TResult visit(ArrayAggregateVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitMultipleArrayAggregate(this, arg);
|
||||
}
|
||||
|
||||
public Expression E;
|
||||
public ArrayAggregate AA;
|
||||
public final Expression E;
|
||||
public final ArrayAggregate AA;
|
||||
}
|
||||
+10
-9
@@ -12,26 +12,27 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Aggregates;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.RecordAggregateVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class MultipleRecordAggregate extends RecordAggregate {
|
||||
|
||||
public MultipleRecordAggregate(Identifier iAST, Expression eAST, RecordAggregate raAST,
|
||||
SourcePosition position) {
|
||||
public MultipleRecordAggregate(Identifier iAST, Expression eAST, RecordAggregate raAST, SourcePosition position) {
|
||||
super(position);
|
||||
I = iAST;
|
||||
E = eAST;
|
||||
RA = raAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitMultipleRecordAggregate(this, o);
|
||||
public <TArg, TResult> TResult visit(RecordAggregateVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitMultipleRecordAggregate(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public Expression E;
|
||||
public RecordAggregate RA;
|
||||
public final Identifier I;
|
||||
public final Expression E;
|
||||
public final RecordAggregate RA;
|
||||
}
|
||||
+11
-2
@@ -12,11 +12,14 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Aggregates;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Types.FieldTypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.RecordAggregateVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class RecordAggregate extends AST {
|
||||
public abstract class RecordAggregate extends AbstractSyntaxTree {
|
||||
|
||||
public RecordAggregate(SourcePosition position) {
|
||||
super(position);
|
||||
@@ -24,4 +27,10 @@ public abstract class RecordAggregate extends AST {
|
||||
}
|
||||
|
||||
public FieldTypeDenoter type;
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(RecordAggregateVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(RecordAggregateVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Aggregates;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SingleArrayAggregate extends ArrayAggregate {
|
||||
@@ -23,10 +25,9 @@ public class SingleArrayAggregate extends ArrayAggregate {
|
||||
E = eAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSingleArrayAggregate(this, o);
|
||||
public <TArg, TResult> TResult visit(ArrayAggregateVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSingleArrayAggregate(this, arg);
|
||||
}
|
||||
|
||||
public Expression E;
|
||||
public final Expression E;
|
||||
}
|
||||
+8
-6
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Aggregates;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.RecordAggregateVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SingleRecordAggregate extends RecordAggregate {
|
||||
@@ -24,11 +27,10 @@ public class SingleRecordAggregate extends RecordAggregate {
|
||||
E = eAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSingleRecordAggregate(this, o);
|
||||
public <TArg, TResult> TResult visit(RecordAggregateVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSingleRecordAggregate(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public Expression E;
|
||||
public final Identifier I;
|
||||
public final Expression E;
|
||||
}
|
||||
+8
-6
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Commands;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||
import Triangle.AbstractSyntaxTrees.Vnames.Vname;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class AssignCommand extends Command {
|
||||
@@ -24,11 +27,10 @@ public class AssignCommand extends Command {
|
||||
E = eAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitAssignCommand(this, o);
|
||||
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitAssignCommand(this, arg);
|
||||
}
|
||||
|
||||
public Vname V;
|
||||
public Expression E;
|
||||
public final Vname V;
|
||||
public final Expression E;
|
||||
}
|
||||
+8
-6
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Commands;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Actuals.ActualParameterSequence;
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class CallCommand extends Command {
|
||||
@@ -24,11 +27,10 @@ public class CallCommand extends Command {
|
||||
APS = apsAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitCallCommand(this, o);
|
||||
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitCallCommand(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public ActualParameterSequence APS;
|
||||
public final Identifier I;
|
||||
public final ActualParameterSequence APS;
|
||||
}
|
||||
+10
-2
@@ -12,13 +12,21 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Commands;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class Command extends AST {
|
||||
public abstract class Command extends AbstractSyntaxTree {
|
||||
|
||||
public Command(SourcePosition position) {
|
||||
super(position);
|
||||
}
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Commands;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class EmptyCommand extends Command {
|
||||
@@ -22,8 +23,7 @@ public class EmptyCommand extends Command {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitEmptyCommand(this, o);
|
||||
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitEmptyCommand(this, arg);
|
||||
}
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Commands;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class IfCommand extends Command {
|
||||
@@ -25,11 +27,10 @@ public class IfCommand extends Command {
|
||||
C2 = c2AST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitIfCommand(this, o);
|
||||
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitIfCommand(this, arg);
|
||||
}
|
||||
|
||||
public Expression E;
|
||||
public Command C1, C2;
|
||||
public final Expression E;
|
||||
public final Command C1, C2;
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Commands;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.Declaration;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class LetCommand extends Command {
|
||||
@@ -24,11 +26,10 @@ public class LetCommand extends Command {
|
||||
C = cAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitLetCommand(this, o);
|
||||
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitLetCommand(this, arg);
|
||||
}
|
||||
|
||||
public Declaration D;
|
||||
public Command C;
|
||||
public final Declaration D;
|
||||
public final Command C;
|
||||
}
|
||||
+5
-5
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Commands;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SequentialCommand extends Command {
|
||||
@@ -24,10 +25,9 @@ public class SequentialCommand extends Command {
|
||||
C2 = c2AST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSequentialCommand(this, o);
|
||||
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSequentialCommand(this, arg);
|
||||
}
|
||||
|
||||
public Command C1, C2;
|
||||
public final Command C1, C2;
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Commands;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class WhileCommand extends Command {
|
||||
@@ -24,11 +26,10 @@ public class WhileCommand extends Command {
|
||||
C = cAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitWhileCommand(this, o);
|
||||
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitWhileCommand(this, arg);
|
||||
}
|
||||
|
||||
public Expression E;
|
||||
public Command C;
|
||||
public final Expression E;
|
||||
public final Command C;
|
||||
}
|
||||
+8
-6
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Operator;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class BinaryOperatorDeclaration extends Declaration {
|
||||
@@ -27,11 +30,10 @@ public class BinaryOperatorDeclaration extends Declaration {
|
||||
RES = resultAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitBinaryOperatorDeclaration(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitBinaryOperatorDeclaration(this, arg);
|
||||
}
|
||||
|
||||
public Operator O;
|
||||
public TypeDenoter ARG1, ARG2, RES;
|
||||
public final Operator O;
|
||||
public final TypeDenoter ARG1, ARG2, RES;
|
||||
}
|
||||
+8
-6
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class ConstDeclaration extends Declaration {
|
||||
@@ -24,11 +27,10 @@ public class ConstDeclaration extends Declaration {
|
||||
E = eAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitConstDeclaration(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitConstDeclaration(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public Expression E;
|
||||
public final Identifier I;
|
||||
public final Expression E;
|
||||
}
|
||||
+10
-2
@@ -12,11 +12,13 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class Declaration extends AST {
|
||||
public abstract class Declaration extends AbstractSyntaxTree {
|
||||
|
||||
public Declaration(SourcePosition position) {
|
||||
super(position);
|
||||
@@ -24,4 +26,10 @@ public abstract class Declaration extends AST {
|
||||
}
|
||||
|
||||
public boolean duplicated;
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+11
-7
@@ -12,8 +12,13 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Formals.FormalParameterSequence;
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class FuncDeclaration extends Declaration {
|
||||
@@ -27,13 +32,12 @@ public class FuncDeclaration extends Declaration {
|
||||
E = eAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitFuncDeclaration(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitFuncDeclaration(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public FormalParameterSequence FPS;
|
||||
public final Identifier I;
|
||||
public final FormalParameterSequence FPS;
|
||||
public TypeDenoter T;
|
||||
public Expression E;
|
||||
public final Expression E;
|
||||
}
|
||||
+10
-7
@@ -12,8 +12,12 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Commands.Command;
|
||||
import Triangle.AbstractSyntaxTrees.Formals.FormalParameterSequence;
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class ProcDeclaration extends Declaration {
|
||||
@@ -25,12 +29,11 @@ public class ProcDeclaration extends Declaration {
|
||||
C = cAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitProcDeclaration(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitProcDeclaration(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public FormalParameterSequence FPS;
|
||||
public Command C;
|
||||
public final Identifier I;
|
||||
public final FormalParameterSequence FPS;
|
||||
public final Command C;
|
||||
}
|
||||
+5
-5
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SequentialDeclaration extends Declaration {
|
||||
@@ -24,10 +25,9 @@ public class SequentialDeclaration extends Declaration {
|
||||
D2 = d2AST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSequentialDeclaration(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSequentialDeclaration(this, arg);
|
||||
}
|
||||
|
||||
public Declaration D1, D2;
|
||||
public final Declaration D1, D2;
|
||||
}
|
||||
+9
-8
@@ -12,25 +12,26 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Operator;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class UnaryOperatorDeclaration extends Declaration {
|
||||
|
||||
public UnaryOperatorDeclaration(Operator oAST, TypeDenoter argAST, TypeDenoter resultAST,
|
||||
SourcePosition position) {
|
||||
public UnaryOperatorDeclaration(Operator oAST, TypeDenoter argAST, TypeDenoter resultAST, SourcePosition position) {
|
||||
super(position);
|
||||
O = oAST;
|
||||
ARG = argAST;
|
||||
RES = resultAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitUnaryOperatorDeclaration(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitUnaryOperatorDeclaration(this, arg);
|
||||
}
|
||||
|
||||
public Operator O;
|
||||
public TypeDenoter ARG, RES;
|
||||
public final Operator O;
|
||||
public final TypeDenoter ARG, RES;
|
||||
}
|
||||
+7
-5
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class VarDeclaration extends Declaration {
|
||||
@@ -24,11 +27,10 @@ public class VarDeclaration extends Declaration {
|
||||
T = tAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitVarDeclaration(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitVarDeclaration(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public final Identifier I;
|
||||
public TypeDenoter T;
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Aggregates.ArrayAggregate;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class ArrayExpression extends Expression {
|
||||
@@ -23,10 +25,9 @@ public class ArrayExpression extends Expression {
|
||||
AA = aaAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitArrayExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitArrayExpression(this, arg);
|
||||
}
|
||||
|
||||
public ArrayAggregate AA;
|
||||
public final ArrayAggregate AA;
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Operator;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class BinaryExpression extends Expression {
|
||||
@@ -25,11 +27,10 @@ public class BinaryExpression extends Expression {
|
||||
E2 = e2AST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitBinaryExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitBinaryExpression(this, arg);
|
||||
}
|
||||
|
||||
public Expression E1, E2;
|
||||
public Operator O;
|
||||
public final Expression E1, E2;
|
||||
public final Operator O;
|
||||
}
|
||||
+8
-6
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Actuals.ActualParameterSequence;
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class CallExpression extends Expression {
|
||||
@@ -24,11 +27,10 @@ public class CallExpression extends Expression {
|
||||
APS = apsAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitCallExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitCallExpression(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public ActualParameterSequence APS;
|
||||
public final Identifier I;
|
||||
public final ActualParameterSequence APS;
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class CharacterExpression extends Expression {
|
||||
@@ -23,10 +25,9 @@ public class CharacterExpression extends Expression {
|
||||
CL = clAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitCharacterExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitCharacterExpression(this, arg);
|
||||
}
|
||||
|
||||
public CharacterLiteral CL;
|
||||
public final CharacterLiteral CL;
|
||||
}
|
||||
+4
-4
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class EmptyExpression extends Expression {
|
||||
@@ -22,8 +23,7 @@ public class EmptyExpression extends Expression {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitEmptyExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitEmptyExpression(this, arg);
|
||||
}
|
||||
}
|
||||
+11
-2
@@ -12,11 +12,14 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class Expression extends AST {
|
||||
public abstract class Expression extends AbstractSyntaxTree {
|
||||
|
||||
public Expression(SourcePosition position) {
|
||||
super(position);
|
||||
@@ -24,4 +27,10 @@ public abstract class Expression extends AST {
|
||||
}
|
||||
|
||||
public TypeDenoter type;
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+5
-5
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class IfExpression extends Expression {
|
||||
@@ -25,10 +26,9 @@ public class IfExpression extends Expression {
|
||||
E3 = e3AST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitIfExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitIfExpression(this, arg);
|
||||
}
|
||||
|
||||
public Expression E1, E2, E3;
|
||||
public final Expression E1, E2, E3;
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class IntegerExpression extends Expression {
|
||||
@@ -23,10 +25,9 @@ public class IntegerExpression extends Expression {
|
||||
IL = ilAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitIntegerExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitIntegerExpression(this, arg);
|
||||
}
|
||||
|
||||
public IntegerLiteral IL;
|
||||
public final IntegerLiteral IL;
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.Declaration;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class LetExpression extends Expression {
|
||||
@@ -24,11 +26,10 @@ public class LetExpression extends Expression {
|
||||
E = eAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitLetExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitLetExpression(this, arg);
|
||||
}
|
||||
|
||||
public Declaration D;
|
||||
public Expression E;
|
||||
public final Declaration D;
|
||||
public final Expression E;
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Aggregates.RecordAggregate;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class RecordExpression extends Expression {
|
||||
@@ -23,10 +25,9 @@ public class RecordExpression extends Expression {
|
||||
RA = raAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitRecordExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitRecordExpression(this, arg);
|
||||
}
|
||||
|
||||
public RecordAggregate RA;
|
||||
public final RecordAggregate RA;
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Operator;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class UnaryExpression extends Expression {
|
||||
@@ -24,11 +26,10 @@ public class UnaryExpression extends Expression {
|
||||
E = eAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitUnaryExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitUnaryExpression(this, arg);
|
||||
}
|
||||
|
||||
public Expression E;
|
||||
public Operator O;
|
||||
public final Expression E;
|
||||
public final Operator O;
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||
import Triangle.AbstractSyntaxTrees.Vnames.Vname;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class VnameExpression extends Expression {
|
||||
@@ -23,10 +25,9 @@ public class VnameExpression extends Expression {
|
||||
V = vAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitVnameExpression(this, o);
|
||||
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitVnameExpression(this, arg);
|
||||
}
|
||||
|
||||
public Vname V;
|
||||
public final Vname V;
|
||||
}
|
||||
+12
-9
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Formals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class ConstFormalParameter extends FormalParameter {
|
||||
@@ -24,20 +27,20 @@ public class ConstFormalParameter extends FormalParameter {
|
||||
T = tAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitConstFormalParameter(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitConstFormalParameter(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public TypeDenoter T;
|
||||
|
||||
@Override
|
||||
public boolean equals(Object fpAST) {
|
||||
if (fpAST instanceof ConstFormalParameter) {
|
||||
ConstFormalParameter cfpAST = (ConstFormalParameter) fpAST;
|
||||
var cfpAST = (ConstFormalParameter) fpAST;
|
||||
return T.equals(cfpAST.T);
|
||||
} else
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public final Identifier I;
|
||||
public TypeDenoter T;
|
||||
}
|
||||
+4
-4
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Formals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class EmptyFormalParameterSequence extends FormalParameterSequence {
|
||||
@@ -22,9 +23,8 @@ public class EmptyFormalParameterSequence extends FormalParameterSequence {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitEmptyFormalParameterSequence(this, o);
|
||||
public <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitEmptyFormalParameterSequence(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
+8
-1
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Formals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.Declaration;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class FormalParameter extends Declaration {
|
||||
@@ -25,4 +27,9 @@ public abstract class FormalParameter extends Declaration {
|
||||
@Override
|
||||
public abstract boolean equals(Object fpAST);
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+10
-2
@@ -12,11 +12,13 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Formals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class FormalParameterSequence extends AST {
|
||||
public abstract class FormalParameterSequence extends AbstractSyntaxTree {
|
||||
|
||||
public FormalParameterSequence(SourcePosition position) {
|
||||
super(position);
|
||||
@@ -24,4 +26,10 @@ public abstract class FormalParameterSequence extends AST {
|
||||
|
||||
@Override
|
||||
public abstract boolean equals(Object fpsAST);
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+8
-6
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Formals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class FuncFormalParameter extends FormalParameter {
|
||||
@@ -26,9 +29,8 @@ public class FuncFormalParameter extends FormalParameter {
|
||||
T = tAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitFuncFormalParameter(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitFuncFormalParameter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -40,7 +42,7 @@ public class FuncFormalParameter extends FormalParameter {
|
||||
return false;
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public FormalParameterSequence FPS;
|
||||
public final Identifier I;
|
||||
public final FormalParameterSequence FPS;
|
||||
public TypeDenoter T;
|
||||
}
|
||||
+8
-7
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Formals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class MultipleFormalParameterSequence extends FormalParameterSequence {
|
||||
@@ -25,9 +26,8 @@ public class MultipleFormalParameterSequence extends FormalParameterSequence {
|
||||
FPS = fpsAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitMultipleFormalParameterSequence(this, o);
|
||||
public <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitMultipleFormalParameterSequence(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -35,10 +35,11 @@ public class MultipleFormalParameterSequence extends FormalParameterSequence {
|
||||
if (fpsAST instanceof MultipleFormalParameterSequence) {
|
||||
MultipleFormalParameterSequence mfpsAST = (MultipleFormalParameterSequence) fpsAST;
|
||||
return FP.equals(mfpsAST.FP) && FPS.equals(mfpsAST.FPS);
|
||||
} else
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public FormalParameter FP;
|
||||
public FormalParameterSequence FPS;
|
||||
public final FormalParameter FP;
|
||||
public final FormalParameterSequence FPS;
|
||||
}
|
||||
+10
-8
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Formals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class ProcFormalParameter extends FormalParameter {
|
||||
@@ -24,20 +26,20 @@ public class ProcFormalParameter extends FormalParameter {
|
||||
FPS = fpsAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitProcFormalParameter(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitProcFormalParameter(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public FormalParameterSequence FPS;
|
||||
|
||||
@Override
|
||||
public boolean equals(Object fpAST) {
|
||||
if (fpAST instanceof ProcFormalParameter) {
|
||||
ProcFormalParameter pfpAST = (ProcFormalParameter) fpAST;
|
||||
return FPS.equals(pfpAST.FPS);
|
||||
} else
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public final Identifier I;
|
||||
public final FormalParameterSequence FPS;
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Formals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SingleFormalParameterSequence extends FormalParameterSequence {
|
||||
@@ -23,9 +24,8 @@ public class SingleFormalParameterSequence extends FormalParameterSequence {
|
||||
FP = fpAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSingleFormalParameterSequence(this, o);
|
||||
public <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSingleFormalParameterSequence(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -33,9 +33,10 @@ public class SingleFormalParameterSequence extends FormalParameterSequence {
|
||||
if (fpsAST instanceof SingleFormalParameterSequence) {
|
||||
SingleFormalParameterSequence sfpsAST = (SingleFormalParameterSequence) fpsAST;
|
||||
return FP.equals(sfpsAST.FP);
|
||||
} else
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public FormalParameter FP;
|
||||
public final FormalParameter FP;
|
||||
}
|
||||
+11
-8
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Formals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class VarFormalParameter extends FormalParameter {
|
||||
@@ -24,20 +27,20 @@ public class VarFormalParameter extends FormalParameter {
|
||||
T = tAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitVarFormalParameter(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitVarFormalParameter(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public TypeDenoter T;
|
||||
|
||||
@Override
|
||||
public boolean equals(Object fpAST) {
|
||||
if (fpAST instanceof VarFormalParameter) {
|
||||
VarFormalParameter vfpAST = (VarFormalParameter) fpAST;
|
||||
return T.equals(vfpAST.T);
|
||||
} else
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public final Identifier I;
|
||||
public TypeDenoter T;
|
||||
}
|
||||
@@ -14,19 +14,24 @@
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Commands.Command;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.ProgramVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class Program extends AST {
|
||||
public class Program extends AbstractSyntaxTree {
|
||||
|
||||
public Program(Command cAST, SourcePosition position) {
|
||||
super(position);
|
||||
C = cAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitProgram(this, o);
|
||||
public Command C;
|
||||
|
||||
public <TArg, TResult> TResult visit(ProgramVisitor<TArg, TResult> visitor, TArg arg) {
|
||||
return visitor.visitProgram(this, arg);
|
||||
}
|
||||
|
||||
public Command C;
|
||||
public <TResult> TResult visit(ProgramVisitor<Void, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
|
||||
+11
-4
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Terminals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.LiteralVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class CharacterLiteral extends Terminal {
|
||||
@@ -22,9 +23,15 @@ public class CharacterLiteral extends Terminal {
|
||||
super(spelling, position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitCharacterLiteral(this, o);
|
||||
public <TArg, TResult> TResult visit(LiteralVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitCharacterLiteral(this, arg);
|
||||
}
|
||||
|
||||
public <TArg, TResult> TResult visit(LiteralVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return spelling.charAt(1);
|
||||
}
|
||||
}
|
||||
+12
-6
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Terminals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.IdentifierVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class Identifier extends Terminal {
|
||||
@@ -24,11 +27,14 @@ public class Identifier extends Terminal {
|
||||
decl = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitIdentifier(this, o);
|
||||
public TypeDenoter type;
|
||||
public AbstractSyntaxTree decl; // Either a Declaration or a FieldTypeDenoter
|
||||
|
||||
public <TArg, TResult> TResult visit(IdentifierVisitor<TArg, TResult> visitor, TArg arg) {
|
||||
return visitor.visitIdentifier(this, arg);
|
||||
}
|
||||
|
||||
public TypeDenoter type;
|
||||
public AST decl; // Either a Declaration or a FieldTypeDenoter
|
||||
public <TArg, TResult> TResult visit(IdentifierVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+11
-4
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Terminals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.LiteralVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class IntegerLiteral extends Terminal {
|
||||
@@ -22,9 +23,15 @@ public class IntegerLiteral extends Terminal {
|
||||
super(spelling, position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitIntegerLiteral(this, o);
|
||||
public <TArg, TResult> TResult visit(LiteralVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitIntegerLiteral(this, arg);
|
||||
}
|
||||
|
||||
public <TArg, TResult> TResult visit(LiteralVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return Integer.parseInt(spelling);
|
||||
}
|
||||
}
|
||||
+10
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Terminals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.Declaration;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.OperatorVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class Operator extends Terminal {
|
||||
@@ -23,10 +25,13 @@ public class Operator extends Terminal {
|
||||
decl = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitOperator(this, o);
|
||||
public Declaration decl;
|
||||
|
||||
public <TArg, TResult> TResult visit(OperatorVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitOperator(this, arg);
|
||||
}
|
||||
|
||||
public Declaration decl;
|
||||
public <TArg, TResult> TResult visit(OperatorVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -12,11 +12,12 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Terminals;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
abstract public class Terminal extends AST {
|
||||
public abstract class Terminal extends AbstractSyntaxTree {
|
||||
|
||||
public Terminal(String spelling, SourcePosition position) {
|
||||
super(position);
|
||||
+4
-4
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class AnyTypeDenoter extends TypeDenoter {
|
||||
@@ -22,9 +23,8 @@ public class AnyTypeDenoter extends TypeDenoter {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitAnyTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitAnyTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
+10
-8
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class ArrayTypeDenoter extends TypeDenoter {
|
||||
@@ -24,22 +26,22 @@ public class ArrayTypeDenoter extends TypeDenoter {
|
||||
T = tAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitArrayTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitArrayTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj != null && obj instanceof ErrorTypeDenoter)
|
||||
if (obj != null && obj instanceof ErrorTypeDenoter) {
|
||||
return true;
|
||||
else if (obj != null && obj instanceof ArrayTypeDenoter)
|
||||
} else if (obj != null && obj instanceof ArrayTypeDenoter) {
|
||||
return this.IL.spelling.compareTo(((ArrayTypeDenoter) obj).IL.spelling) == 0
|
||||
&& this.T.equals(((ArrayTypeDenoter) obj).T);
|
||||
else
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public IntegerLiteral IL;
|
||||
public final IntegerLiteral IL;
|
||||
public TypeDenoter T;
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class BoolTypeDenoter extends TypeDenoter {
|
||||
@@ -22,16 +23,16 @@ public class BoolTypeDenoter extends TypeDenoter {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitBoolTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitBoolTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof ErrorTypeDenoter))
|
||||
if ((obj != null) && (obj instanceof ErrorTypeDenoter)) {
|
||||
return true;
|
||||
else
|
||||
} else {
|
||||
return ((obj != null) && (obj instanceof BoolTypeDenoter));
|
||||
}
|
||||
}
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class CharTypeDenoter extends TypeDenoter {
|
||||
@@ -22,16 +23,16 @@ public class CharTypeDenoter extends TypeDenoter {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitCharTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitCharTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj != null && obj instanceof ErrorTypeDenoter)
|
||||
if (obj != null && obj instanceof ErrorTypeDenoter) {
|
||||
return true;
|
||||
else
|
||||
} else {
|
||||
return (obj != null && obj instanceof CharTypeDenoter);
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class ErrorTypeDenoter extends TypeDenoter {
|
||||
@@ -22,9 +23,8 @@ public class ErrorTypeDenoter extends TypeDenoter {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitErrorTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitErrorTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
+1
-4
@@ -12,7 +12,7 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
@@ -21,7 +21,4 @@ public abstract class FieldTypeDenoter extends TypeDenoter {
|
||||
public FieldTypeDenoter(SourcePosition position) {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract boolean equals(Object obj);
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class IntTypeDenoter extends TypeDenoter {
|
||||
@@ -22,16 +23,16 @@ public class IntTypeDenoter extends TypeDenoter {
|
||||
super(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitIntTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitIntTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj != null && obj instanceof ErrorTypeDenoter)
|
||||
if (obj != null && obj instanceof ErrorTypeDenoter) {
|
||||
return true;
|
||||
else
|
||||
} else {
|
||||
return (obj != null && obj instanceof IntTypeDenoter);
|
||||
}
|
||||
}
|
||||
}
|
||||
+8
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class MultipleFieldTypeDenoter extends FieldTypeDenoter {
|
||||
@@ -26,9 +28,8 @@ public class MultipleFieldTypeDenoter extends FieldTypeDenoter {
|
||||
FT = ftAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitMultipleFieldTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitMultipleFieldTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -36,11 +37,12 @@ public class MultipleFieldTypeDenoter extends FieldTypeDenoter {
|
||||
if (obj != null && obj instanceof MultipleFieldTypeDenoter) {
|
||||
MultipleFieldTypeDenoter ft = (MultipleFieldTypeDenoter) obj;
|
||||
return (this.I.spelling.compareTo(ft.I.spelling) == 0) && this.T.equals(ft.T) && this.FT.equals(ft.FT);
|
||||
} else
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public final Identifier I;
|
||||
public TypeDenoter T;
|
||||
public FieldTypeDenoter FT;
|
||||
}
|
||||
+8
-7
@@ -12,8 +12,9 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class RecordTypeDenoter extends TypeDenoter {
|
||||
@@ -23,19 +24,19 @@ public class RecordTypeDenoter extends TypeDenoter {
|
||||
FT = ftAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitRecordTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitRecordTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj != null && obj instanceof ErrorTypeDenoter)
|
||||
if (obj != null && obj instanceof ErrorTypeDenoter) {
|
||||
return true;
|
||||
else if (obj != null && obj instanceof RecordTypeDenoter)
|
||||
} else if (obj != null && obj instanceof RecordTypeDenoter) {
|
||||
return this.FT.equals(((RecordTypeDenoter) obj).FT);
|
||||
else
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public FieldTypeDenoter FT;
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SimpleTypeDenoter extends TypeDenoter {
|
||||
@@ -23,9 +25,8 @@ public class SimpleTypeDenoter extends TypeDenoter {
|
||||
I = iAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSimpleTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSimpleTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -33,5 +34,5 @@ public class SimpleTypeDenoter extends TypeDenoter {
|
||||
return false; // should not happen
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public final Identifier I;
|
||||
}
|
||||
+8
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SingleFieldTypeDenoter extends FieldTypeDenoter {
|
||||
@@ -24,9 +26,8 @@ public class SingleFieldTypeDenoter extends FieldTypeDenoter {
|
||||
T = tAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSingleFieldTypeDenoter(this, o);
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSingleFieldTypeDenoter(this, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -34,10 +35,11 @@ public class SingleFieldTypeDenoter extends FieldTypeDenoter {
|
||||
if (obj != null && obj instanceof SingleFieldTypeDenoter) {
|
||||
SingleFieldTypeDenoter ft = (SingleFieldTypeDenoter) obj;
|
||||
return (this.I.spelling.compareTo(ft.I.spelling) == 0) && this.T.equals(ft.T);
|
||||
} else
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public final Identifier I;
|
||||
public TypeDenoter T;
|
||||
}
|
||||
+7
-5
@@ -12,8 +12,11 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.Declaration;
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class TypeDeclaration extends Declaration {
|
||||
@@ -24,11 +27,10 @@ public class TypeDeclaration extends Declaration {
|
||||
T = tAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitTypeDeclaration(this, o);
|
||||
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitTypeDeclaration(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public final Identifier I;
|
||||
public TypeDenoter T;
|
||||
}
|
||||
+9
-2
@@ -12,11 +12,13 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Types;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class TypeDenoter extends AST {
|
||||
public abstract class TypeDenoter extends AbstractSyntaxTree {
|
||||
|
||||
public TypeDenoter(SourcePosition position) {
|
||||
super(position);
|
||||
@@ -25,4 +27,9 @@ public abstract class TypeDenoter extends AST {
|
||||
@Override
|
||||
public abstract boolean equals(Object obj);
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
@@ -1,154 +0,0 @@
|
||||
/*
|
||||
* @(#)Visitor.java 2.1 2003/10/07
|
||||
*
|
||||
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown
|
||||
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland
|
||||
* and School of Computer and Math Sciences, The Robert Gordon University,
|
||||
* St. Andrew Street, Aberdeen AB25 1HG, Scotland.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is provided free for educational use only. It may
|
||||
* not be used for commercial purposes without the prior written permission
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
|
||||
public interface Visitor {
|
||||
|
||||
// Commands
|
||||
Object visitAssignCommand(AssignCommand ast, Object o);
|
||||
|
||||
Object visitCallCommand(CallCommand ast, Object o);
|
||||
|
||||
Object visitEmptyCommand(EmptyCommand ast, Object o);
|
||||
|
||||
Object visitIfCommand(IfCommand ast, Object o);
|
||||
|
||||
Object visitLetCommand(LetCommand ast, Object o);
|
||||
|
||||
Object visitSequentialCommand(SequentialCommand ast, Object o);
|
||||
|
||||
Object visitWhileCommand(WhileCommand ast, Object o);
|
||||
|
||||
// Expressions
|
||||
Object visitArrayExpression(ArrayExpression ast, Object o);
|
||||
|
||||
Object visitBinaryExpression(BinaryExpression ast, Object o);
|
||||
|
||||
Object visitCallExpression(CallExpression ast, Object o);
|
||||
|
||||
Object visitCharacterExpression(CharacterExpression ast, Object o);
|
||||
|
||||
Object visitEmptyExpression(EmptyExpression ast, Object o);
|
||||
|
||||
Object visitIfExpression(IfExpression ast, Object o);
|
||||
|
||||
Object visitIntegerExpression(IntegerExpression ast, Object o);
|
||||
|
||||
Object visitLetExpression(LetExpression ast, Object o);
|
||||
|
||||
Object visitRecordExpression(RecordExpression ast, Object o);
|
||||
|
||||
Object visitUnaryExpression(UnaryExpression ast, Object o);
|
||||
|
||||
Object visitVnameExpression(VnameExpression ast, Object o);
|
||||
|
||||
// Declarations
|
||||
Object visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Object o);
|
||||
|
||||
Object visitConstDeclaration(ConstDeclaration ast, Object o);
|
||||
|
||||
Object visitFuncDeclaration(FuncDeclaration ast, Object o);
|
||||
|
||||
Object visitProcDeclaration(ProcDeclaration ast, Object o);
|
||||
|
||||
Object visitSequentialDeclaration(SequentialDeclaration ast, Object o);
|
||||
|
||||
Object visitTypeDeclaration(TypeDeclaration ast, Object o);
|
||||
|
||||
Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Object o);
|
||||
|
||||
Object visitVarDeclaration(VarDeclaration ast, Object o);
|
||||
|
||||
// Array Aggregates
|
||||
Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, Object o);
|
||||
|
||||
Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o);
|
||||
|
||||
// Record Aggregates
|
||||
Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, Object o);
|
||||
|
||||
Object visitSingleRecordAggregate(SingleRecordAggregate ast, Object o);
|
||||
|
||||
// Formal Parameters
|
||||
Object visitConstFormalParameter(ConstFormalParameter ast, Object o);
|
||||
|
||||
Object visitFuncFormalParameter(FuncFormalParameter ast, Object o);
|
||||
|
||||
Object visitProcFormalParameter(ProcFormalParameter ast, Object o);
|
||||
|
||||
Object visitVarFormalParameter(VarFormalParameter ast, Object o);
|
||||
|
||||
Object visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Object o);
|
||||
|
||||
Object visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Object o);
|
||||
|
||||
Object visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Object o);
|
||||
|
||||
// Actual Parameters
|
||||
Object visitConstActualParameter(ConstActualParameter ast, Object o);
|
||||
|
||||
Object visitFuncActualParameter(FuncActualParameter ast, Object o);
|
||||
|
||||
Object visitProcActualParameter(ProcActualParameter ast, Object o);
|
||||
|
||||
Object visitVarActualParameter(VarActualParameter ast, Object o);
|
||||
|
||||
Object visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Object o);
|
||||
|
||||
Object visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Object o);
|
||||
|
||||
Object visitSingleActualParameterSequence(SingleActualParameterSequence ast, Object o);
|
||||
|
||||
// Type Denoters
|
||||
Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o);
|
||||
|
||||
Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o);
|
||||
|
||||
Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o);
|
||||
|
||||
Object visitCharTypeDenoter(CharTypeDenoter ast, Object o);
|
||||
|
||||
Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o);
|
||||
|
||||
Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, Object o);
|
||||
|
||||
Object visitIntTypeDenoter(IntTypeDenoter ast, Object o);
|
||||
|
||||
Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o);
|
||||
|
||||
Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Object o);
|
||||
|
||||
Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Object o);
|
||||
|
||||
// Literals, Identifiers and Operators
|
||||
Object visitCharacterLiteral(CharacterLiteral ast, Object o);
|
||||
|
||||
Object visitIdentifier(Identifier ast, Object o);
|
||||
|
||||
Object visitIntegerLiteral(IntegerLiteral ast, Object o);
|
||||
|
||||
Object visitOperator(Operator ast, Object o);
|
||||
|
||||
// Value-or-variable names
|
||||
Object visitDotVname(DotVname ast, Object o);
|
||||
|
||||
Object visitSimpleVname(SimpleVname ast, Object o);
|
||||
|
||||
Object visitSubscriptVname(SubscriptVname ast, Object o);
|
||||
|
||||
// Programs
|
||||
Object visitProgram(Program ast, Object o);
|
||||
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Actuals.EmptyActualParameterSequence;
|
||||
import Triangle.AbstractSyntaxTrees.Actuals.MultipleActualParameterSequence;
|
||||
import Triangle.AbstractSyntaxTrees.Actuals.SingleActualParameterSequence;
|
||||
|
||||
public interface ActualParameterSequenceVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, TArg arg);
|
||||
|
||||
TResult visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, TArg arg);
|
||||
|
||||
TResult visitSingleActualParameterSequence(SingleActualParameterSequence ast, TArg arg);
|
||||
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Actuals.ConstActualParameter;
|
||||
import Triangle.AbstractSyntaxTrees.Actuals.FuncActualParameter;
|
||||
import Triangle.AbstractSyntaxTrees.Actuals.ProcActualParameter;
|
||||
import Triangle.AbstractSyntaxTrees.Actuals.VarActualParameter;
|
||||
|
||||
public interface ActualParameterVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitConstActualParameter(ConstActualParameter ast, TArg arg);
|
||||
|
||||
TResult visitFuncActualParameter(FuncActualParameter ast, TArg arg);
|
||||
|
||||
TResult visitProcActualParameter(ProcActualParameter ast, TArg arg);
|
||||
|
||||
TResult visitVarActualParameter(VarActualParameter ast, TArg arg);
|
||||
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Aggregates.MultipleArrayAggregate;
|
||||
import Triangle.AbstractSyntaxTrees.Aggregates.SingleArrayAggregate;
|
||||
|
||||
public interface ArrayAggregateVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitMultipleArrayAggregate(MultipleArrayAggregate ast, TArg arg);
|
||||
|
||||
TResult visitSingleArrayAggregate(SingleArrayAggregate ast, TArg arg);
|
||||
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Commands.AssignCommand;
|
||||
import Triangle.AbstractSyntaxTrees.Commands.CallCommand;
|
||||
import Triangle.AbstractSyntaxTrees.Commands.EmptyCommand;
|
||||
import Triangle.AbstractSyntaxTrees.Commands.IfCommand;
|
||||
import Triangle.AbstractSyntaxTrees.Commands.LetCommand;
|
||||
import Triangle.AbstractSyntaxTrees.Commands.SequentialCommand;
|
||||
import Triangle.AbstractSyntaxTrees.Commands.WhileCommand;
|
||||
|
||||
public interface CommandVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitAssignCommand(AssignCommand ast, TArg arg);
|
||||
|
||||
TResult visitCallCommand(CallCommand ast, TArg arg);
|
||||
|
||||
TResult visitEmptyCommand(EmptyCommand ast, TArg arg);
|
||||
|
||||
TResult visitIfCommand(IfCommand ast, TArg arg);
|
||||
|
||||
TResult visitLetCommand(LetCommand ast, TArg arg);
|
||||
|
||||
TResult visitSequentialCommand(SequentialCommand ast, TArg arg);
|
||||
|
||||
TResult visitWhileCommand(WhileCommand ast, TArg arg);
|
||||
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.BinaryOperatorDeclaration;
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.ConstDeclaration;
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.FuncDeclaration;
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.ProcDeclaration;
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.SequentialDeclaration;
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.UnaryOperatorDeclaration;
|
||||
import Triangle.AbstractSyntaxTrees.Declarations.VarDeclaration;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDeclaration;
|
||||
|
||||
public interface DeclarationVisitor<TArg, TResult> extends FormalParameterVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, TArg arg);
|
||||
|
||||
TResult visitConstDeclaration(ConstDeclaration ast, TArg arg);
|
||||
|
||||
TResult visitFuncDeclaration(FuncDeclaration ast, TArg arg);
|
||||
|
||||
TResult visitProcDeclaration(ProcDeclaration ast, TArg arg);
|
||||
|
||||
TResult visitSequentialDeclaration(SequentialDeclaration ast, TArg arg);
|
||||
|
||||
TResult visitTypeDeclaration(TypeDeclaration ast, TArg arg);
|
||||
|
||||
TResult visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, TArg arg);
|
||||
|
||||
TResult visitVarDeclaration(VarDeclaration ast, TArg arg);
|
||||
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.ArrayExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.BinaryExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.CallExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.CharacterExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.EmptyExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.IfExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.IntegerExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.LetExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.RecordExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.UnaryExpression;
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.VnameExpression;
|
||||
|
||||
public interface ExpressionVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitArrayExpression(ArrayExpression ast, TArg arg);
|
||||
|
||||
TResult visitBinaryExpression(BinaryExpression ast, TArg arg);
|
||||
|
||||
TResult visitCallExpression(CallExpression ast, TArg arg);
|
||||
|
||||
TResult visitCharacterExpression(CharacterExpression ast, TArg arg);
|
||||
|
||||
TResult visitEmptyExpression(EmptyExpression ast, TArg arg);
|
||||
|
||||
TResult visitIfExpression(IfExpression ast, TArg arg);
|
||||
|
||||
TResult visitIntegerExpression(IntegerExpression ast, TArg arg);
|
||||
|
||||
TResult visitLetExpression(LetExpression ast, TArg arg);
|
||||
|
||||
TResult visitRecordExpression(RecordExpression ast, TArg arg);
|
||||
|
||||
TResult visitUnaryExpression(UnaryExpression ast, TArg arg);
|
||||
|
||||
TResult visitVnameExpression(VnameExpression ast, TArg arg);
|
||||
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Types.MultipleFieldTypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Types.SingleFieldTypeDenoter;
|
||||
|
||||
public interface FieldTypeDenoterVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, TArg arg);
|
||||
|
||||
TResult visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, TArg arg);
|
||||
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Formals.EmptyFormalParameterSequence;
|
||||
import Triangle.AbstractSyntaxTrees.Formals.MultipleFormalParameterSequence;
|
||||
import Triangle.AbstractSyntaxTrees.Formals.SingleFormalParameterSequence;
|
||||
|
||||
public interface FormalParameterSequenceVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, TArg arg);
|
||||
|
||||
TResult visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, TArg arg);
|
||||
|
||||
TResult visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, TArg arg);
|
||||
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Formals.ConstFormalParameter;
|
||||
import Triangle.AbstractSyntaxTrees.Formals.FuncFormalParameter;
|
||||
import Triangle.AbstractSyntaxTrees.Formals.ProcFormalParameter;
|
||||
import Triangle.AbstractSyntaxTrees.Formals.VarFormalParameter;
|
||||
|
||||
public interface FormalParameterVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitConstFormalParameter(ConstFormalParameter ast, TArg arg);
|
||||
|
||||
TResult visitFuncFormalParameter(FuncFormalParameter ast, TArg arg);
|
||||
|
||||
TResult visitProcFormalParameter(ProcFormalParameter ast, TArg arg);
|
||||
|
||||
TResult visitVarFormalParameter(VarFormalParameter ast, TArg arg);
|
||||
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
|
||||
public interface IdentifierVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitIdentifier(Identifier ast, TArg arg);
|
||||
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral;
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral;
|
||||
|
||||
public interface LiteralVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitCharacterLiteral(CharacterLiteral ast, TArg arg);
|
||||
|
||||
TResult visitIntegerLiteral(IntegerLiteral ast, TArg arg);
|
||||
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Operator;
|
||||
|
||||
public interface OperatorVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitOperator(Operator ast, TArg arg);
|
||||
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Program;
|
||||
|
||||
public interface ProgramVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitProgram(Program ast, TArg arg);
|
||||
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Aggregates.MultipleRecordAggregate;
|
||||
import Triangle.AbstractSyntaxTrees.Aggregates.SingleRecordAggregate;
|
||||
|
||||
public interface RecordAggregateVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitMultipleRecordAggregate(MultipleRecordAggregate ast, TArg arg);
|
||||
|
||||
TResult visitSingleRecordAggregate(SingleRecordAggregate ast, TArg arg);
|
||||
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Types.AnyTypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Types.ArrayTypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Types.BoolTypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Types.CharTypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Types.ErrorTypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Types.IntTypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Types.RecordTypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Types.SimpleTypeDenoter;
|
||||
|
||||
public interface TypeDenoterVisitor<TArg, TResult> extends FieldTypeDenoterVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitAnyTypeDenoter(AnyTypeDenoter ast, TArg arg);
|
||||
|
||||
TResult visitArrayTypeDenoter(ArrayTypeDenoter ast, TArg arg);
|
||||
|
||||
TResult visitBoolTypeDenoter(BoolTypeDenoter ast, TArg arg);
|
||||
|
||||
TResult visitCharTypeDenoter(CharTypeDenoter ast, TArg arg);
|
||||
|
||||
TResult visitErrorTypeDenoter(ErrorTypeDenoter ast, TArg arg);
|
||||
|
||||
TResult visitSimpleTypeDenoter(SimpleTypeDenoter ast, TArg arg);
|
||||
|
||||
TResult visitIntTypeDenoter(IntTypeDenoter ast, TArg arg);
|
||||
|
||||
TResult visitRecordTypeDenoter(RecordTypeDenoter ast, TArg arg);
|
||||
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Vnames.DotVname;
|
||||
import Triangle.AbstractSyntaxTrees.Vnames.SimpleVname;
|
||||
import Triangle.AbstractSyntaxTrees.Vnames.SubscriptVname;
|
||||
|
||||
public interface VnameVisitor<TArg, TResult> {
|
||||
|
||||
TResult visitDotVname(DotVname ast, TArg arg);
|
||||
|
||||
TResult visitSimpleVname(SimpleVname ast, TArg arg);
|
||||
|
||||
TResult visitSubscriptVname(SubscriptVname ast, TArg arg);
|
||||
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Vnames;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class DotVname extends Vname {
|
||||
@@ -24,11 +26,10 @@ public class DotVname extends Vname {
|
||||
I = iAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitDotVname(this, o);
|
||||
public <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitDotVname(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public Vname V;
|
||||
public final Identifier I;
|
||||
public final Vname V;
|
||||
}
|
||||
+6
-5
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Vnames;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SimpleVname extends Vname {
|
||||
@@ -23,10 +25,9 @@ public class SimpleVname extends Vname {
|
||||
I = iAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSimpleVname(this, o);
|
||||
public <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSimpleVname(this, arg);
|
||||
}
|
||||
|
||||
public Identifier I;
|
||||
public final Identifier I;
|
||||
}
|
||||
+7
-6
@@ -12,8 +12,10 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Vnames;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public class SubscriptVname extends Vname {
|
||||
@@ -24,11 +26,10 @@ public class SubscriptVname extends Vname {
|
||||
E = eAST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(Visitor v, Object o) {
|
||||
return v.visitSubscriptVname(this, o);
|
||||
public <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> v, TArg arg) {
|
||||
return v.visitSubscriptVname(this, arg);
|
||||
}
|
||||
|
||||
public Expression E;
|
||||
public Vname V;
|
||||
public final Expression E;
|
||||
public final Vname V;
|
||||
}
|
||||
+11
-2
@@ -12,11 +12,14 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.AbstractSyntaxTrees;
|
||||
package Triangle.AbstractSyntaxTrees.Vnames;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||
import Triangle.AbstractSyntaxTrees.Types.TypeDenoter;
|
||||
import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor;
|
||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||
|
||||
public abstract class Vname extends AST {
|
||||
public abstract class Vname extends AbstractSyntaxTree {
|
||||
|
||||
public Vname(SourcePosition position) {
|
||||
super(position);
|
||||
@@ -27,4 +30,10 @@ public abstract class Vname extends AST {
|
||||
public boolean variable, indexed;
|
||||
public int offset;
|
||||
public TypeDenoter type;
|
||||
|
||||
public abstract <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> visitor, TArg arg);
|
||||
|
||||
public <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> visitor) {
|
||||
return visit(visitor, null);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
package Triangle.CodeGenerator;
|
||||
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import Triangle.ErrorReporter;
|
||||
import Triangle.AbstractMachine.Instruction;
|
||||
import Triangle.AbstractMachine.Machine;
|
||||
import Triangle.AbstractMachine.OpCode;
|
||||
import Triangle.AbstractMachine.Primitive;
|
||||
import Triangle.AbstractMachine.Register;
|
||||
|
||||
public class Emitter {
|
||||
|
||||
// OBJECT CODE
|
||||
|
||||
// Implementation notes:
|
||||
// Object code is generated directly into the TAM Code Store, starting at
|
||||
// CB.
|
||||
// The address of the next instruction is held in nextInstrAddr.
|
||||
|
||||
ErrorReporter errorReporter;
|
||||
|
||||
int nextInstrAddr;
|
||||
|
||||
public Emitter(ErrorReporter errorReporter) {
|
||||
this.errorReporter = errorReporter;
|
||||
nextInstrAddr = Machine.CB;
|
||||
}
|
||||
|
||||
public int getNextInstrAddr() {
|
||||
return nextInstrAddr;
|
||||
}
|
||||
|
||||
public int emit(OpCode op) {
|
||||
return emit(op, 0, Register.CB, 0);
|
||||
}
|
||||
|
||||
public int emit(OpCode op, int operand) {
|
||||
return emit(op, 0, Register.CB, operand);
|
||||
}
|
||||
|
||||
public int emit(OpCode op, int length, int operand) {
|
||||
return emit(op, length, Register.CB, operand);
|
||||
}
|
||||
|
||||
public int emit(OpCode op, Register staticRegister, Register register, int operand) {
|
||||
return emit(op, staticRegister.ordinal(), register, operand);
|
||||
}
|
||||
|
||||
public int emit(OpCode op, Register register, int operand) {
|
||||
return emit(op, 0, register, operand);
|
||||
}
|
||||
|
||||
public int emit(OpCode op, Register register) {
|
||||
return emit(op, 0, register, 0);
|
||||
}
|
||||
|
||||
public int emit(OpCode op, int length, Register register) {
|
||||
return emit(op, length, register, 0);
|
||||
}
|
||||
|
||||
public int emit(OpCode op, Register register, Primitive primitive) {
|
||||
return emit(op, 0, register, primitive.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends an instruction, with the given fields, to the object code.
|
||||
*
|
||||
* @param op the opcode
|
||||
* @param length the length field
|
||||
* @param register the register field
|
||||
* @param operand the operand field
|
||||
* @return the code address of the new instruction
|
||||
**/
|
||||
public int emit(OpCode op, int length, Register register, int operand) {
|
||||
|
||||
if (length > 255) {
|
||||
errorReporter.reportRestriction("length of operand can't exceed 255 words");
|
||||
length = 255; // to allow code generation to continue
|
||||
}
|
||||
|
||||
var nextInstr = new Instruction(op, register, length, operand);
|
||||
|
||||
var currentInstrAddr = nextInstrAddr;
|
||||
if (nextInstrAddr == Machine.PB) {
|
||||
errorReporter.reportRestriction("too many instructions for code segment");
|
||||
} else {
|
||||
Machine.code[nextInstrAddr++] = nextInstr;
|
||||
}
|
||||
return currentInstrAddr;
|
||||
|
||||
}
|
||||
|
||||
// Patches the d-field of the instruction at address addr with the next
|
||||
// instruction address.
|
||||
public void patch(int addr) {
|
||||
Machine.code[addr].setOperand(nextInstrAddr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the object program in the given object file.
|
||||
*
|
||||
* @param objectFile the object file
|
||||
*/
|
||||
public void saveObjectProgram(String objectFileName) {
|
||||
try (var objectFile = new FileOutputStream(objectFileName)) {
|
||||
var objectStream = new DataOutputStream(objectFile);
|
||||
for (var addr = Machine.CB; addr < nextInstrAddr; addr++) {
|
||||
Machine.code[addr].write(objectStream);
|
||||
}
|
||||
} catch (FileNotFoundException fnfe) {
|
||||
System.err.println("Error opening object file: " + fnfe);
|
||||
} catch (IOException ioe) {
|
||||
System.err.println("Error writing object file: " + ioe);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
+29
@@ -0,0 +1,29 @@
|
||||
package Triangle.CodeGenerator.Entities;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Vnames.Vname;
|
||||
import Triangle.CodeGenerator.Emitter;
|
||||
import Triangle.CodeGenerator.Frame;
|
||||
|
||||
public abstract class AddressableEntity extends RuntimeEntity implements FetchableEntity {
|
||||
|
||||
protected final ObjectAddress address;
|
||||
|
||||
protected AddressableEntity(int size, int level, int displacement) {
|
||||
super(size);
|
||||
address = new ObjectAddress(level, displacement);
|
||||
}
|
||||
|
||||
protected AddressableEntity(int size, Frame frame) {
|
||||
this(size, frame.getLevel(), frame.getSize());
|
||||
}
|
||||
|
||||
public ObjectAddress getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public abstract void encodeStore(Emitter emitter, Frame frame, int size, Vname vname);
|
||||
|
||||
public abstract void encodeFetchAddress(Emitter emitter, Frame frame, Vname vname);
|
||||
|
||||
public abstract void encodeFetch(Emitter emitter, Frame frame, int size, Vname vname);
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* @(#)EqualityRoutine.java 2.1 2003/10/07
|
||||
*
|
||||
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown
|
||||
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland
|
||||
* and School of Computer and Math Sciences, The Robert Gordon University,
|
||||
* St. Andrew Street, Aberdeen AB25 1HG, Scotland.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is provided free for educational use only. It may
|
||||
* not be used for commercial purposes without the prior written permission
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.CodeGenerator.Entities;
|
||||
|
||||
import Triangle.AbstractMachine.OpCode;
|
||||
import Triangle.AbstractMachine.Primitive;
|
||||
import Triangle.AbstractMachine.Register;
|
||||
import Triangle.CodeGenerator.Emitter;
|
||||
import Triangle.CodeGenerator.Frame;
|
||||
|
||||
public class EqualityRoutine extends RuntimeEntity implements RoutineEntity {
|
||||
|
||||
private final Primitive primitive;
|
||||
|
||||
public EqualityRoutine(int size, Primitive primitive) {
|
||||
super(size);
|
||||
this.primitive = primitive;
|
||||
}
|
||||
|
||||
public final Primitive getPrimitive() {
|
||||
return primitive;
|
||||
}
|
||||
|
||||
public void encodeCall(Emitter emitter, Frame frame) {
|
||||
emitter.emit(OpCode.LOADL, frame.getSize() / 2);
|
||||
emitter.emit(OpCode.CALL, Register.PB, primitive);
|
||||
}
|
||||
|
||||
public void encodeFetch(Emitter emitter, Frame frame) {
|
||||
emitter.emit(OpCode.LOADA, 0, Register.SB, 0);
|
||||
emitter.emit(OpCode.LOADA, Register.PB, primitive);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package Triangle.CodeGenerator.Entities;
|
||||
|
||||
import Triangle.AbstractSyntaxTrees.Vnames.Vname;
|
||||
import Triangle.CodeGenerator.Emitter;
|
||||
import Triangle.CodeGenerator.Frame;
|
||||
|
||||
public interface FetchableEntity {
|
||||
|
||||
void encodeFetch(Emitter emitter, Frame frame, int size, Vname vname);
|
||||
|
||||
}
|
||||
+5
-7
@@ -12,20 +12,18 @@
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.CodeGenerator;
|
||||
package Triangle.CodeGenerator.Entities;
|
||||
|
||||
public class Field extends RuntimeEntity {
|
||||
|
||||
public Field() {
|
||||
super();
|
||||
fieldOffset = 0;
|
||||
}
|
||||
private final int fieldOffset;
|
||||
|
||||
public Field(int size, int fieldOffset) {
|
||||
super(size);
|
||||
this.fieldOffset = fieldOffset;
|
||||
}
|
||||
|
||||
public int fieldOffset;
|
||||
|
||||
public final int getFieldOffset() {
|
||||
return fieldOffset;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* @(#)KnownAddress.java 2.1 2003/10/07
|
||||
*
|
||||
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown
|
||||
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland
|
||||
* and School of Computer and Math Sciences, The Robert Gordon University,
|
||||
* St. Andrew Street, Aberdeen AB25 1HG, Scotland.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is provided free for educational use only. It may
|
||||
* not be used for commercial purposes without the prior written permission
|
||||
* of the authors.
|
||||
*/
|
||||
|
||||
package Triangle.CodeGenerator.Entities;
|
||||
|
||||
import Triangle.AbstractMachine.OpCode;
|
||||
import Triangle.AbstractMachine.Primitive;
|
||||
import Triangle.AbstractMachine.Register;
|
||||
import Triangle.AbstractSyntaxTrees.Vnames.Vname;
|
||||
import Triangle.CodeGenerator.Emitter;
|
||||
import Triangle.CodeGenerator.Frame;
|
||||
|
||||
public class KnownAddress extends AddressableEntity {
|
||||
|
||||
public KnownAddress(int size, int level, int displacement) {
|
||||
super(size, level, displacement);
|
||||
}
|
||||
|
||||
public KnownAddress(int size, Frame frame) {
|
||||
super(size, frame);
|
||||
}
|
||||
|
||||
public void encodeStore(Emitter emitter, Frame frame, int size, Vname vname) {
|
||||
if (vname.indexed) {
|
||||
emitter.emit(OpCode.LOADA, 0, frame.getDisplayRegister(address), address.getDisplacement() + vname.offset);
|
||||
emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD);
|
||||
emitter.emit(OpCode.STOREI, size, 0);
|
||||
} else {
|
||||
emitter.emit(OpCode.STORE, size, frame.getDisplayRegister(address),
|
||||
address.getDisplacement() + vname.offset);
|
||||
}
|
||||
}
|
||||
|
||||
public void encodeFetch(Emitter emitter, Frame frame, int size, Vname vname) {
|
||||
if (vname.indexed) {
|
||||
emitter.emit(OpCode.LOADA, 0, frame.getDisplayRegister(address), address.getDisplacement() + vname.offset);
|
||||
emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD);
|
||||
emitter.emit(OpCode.LOADI, size, 0);
|
||||
} else {
|
||||
emitter.emit(OpCode.LOAD, size, frame.getDisplayRegister(address),
|
||||
address.getDisplacement() + vname.offset);
|
||||
}
|
||||
}
|
||||
|
||||
public void encodeFetchAddress(Emitter emitter, Frame frame, Vname vname) {
|
||||
emitter.emit(OpCode.LOADA, 0, frame.getDisplayRegister(address), address.getDisplacement() + vname.offset);
|
||||
if (vname.indexed) {
|
||||
emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD);
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user