diff --git a/ChangeLog b/ChangeLog index 6d8131e..43b5d93 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +Sun Apr 26 18:06:52 2009 Minero Aoki + + * ast/ASTVisitor.java: fork DeclarationVisitor. + + * ast/DeclarationVisitor.java: new class. + + * compiler/Visitor.java: do not visit declarations. + + * compiler/TypeResolver.java: visit declarations explicitly. + + * compiler/IRGenerator.java: remove useless declarations acceptor. + + * compiler/CodeGenerator.java: ditto. + + * ast/Entity.java: accept DeclarationVisitor. + + * ast/DefinedFunction.java: ditto. + + * ast/UndefinedFunction.java: ditto. + + * ast/DefinedVariable.java: ditto. + + * ast/UndefinedVariable.java: ditto. + + * ast/TypeDefinition.java: ditto. + + * ast/StructNode.java: ditto. + + * ast/UnionNode.java: ditto. + + * ast/TypedefNode.java: ditto. + Sun Apr 26 17:44:14 2009 Minero Aoki * net/loveruby/cflat/compiler/IRGenerator.java (SuffixOp): do not diff --git a/net/loveruby/cflat/ast/ASTVisitor.java b/net/loveruby/cflat/ast/ASTVisitor.java index 00e2c32..0d2ea3f 100644 --- a/net/loveruby/cflat/ast/ASTVisitor.java +++ b/net/loveruby/cflat/ast/ASTVisitor.java @@ -1,15 +1,6 @@ package net.loveruby.cflat.ast; public interface ASTVisitor { - // Declarations - public S visit(DefinedVariable var); - public S visit(UndefinedVariable var); - public S visit(DefinedFunction func); - public S visit(UndefinedFunction func); - public S visit(StructNode struct); - public S visit(UnionNode union); - public S visit(TypedefNode typedef); - // Statements public S visit(BlockNode node); public S visit(ExprStmtNode node); diff --git a/net/loveruby/cflat/ast/DeclarationVisitor.java b/net/loveruby/cflat/ast/DeclarationVisitor.java new file mode 100644 index 0000000..2940fcc --- /dev/null +++ b/net/loveruby/cflat/ast/DeclarationVisitor.java @@ -0,0 +1,11 @@ +package net.loveruby.cflat.ast; + +public interface DeclarationVisitor { + public T visit(DefinedVariable var); + public T visit(UndefinedVariable var); + public T visit(DefinedFunction func); + public T visit(UndefinedFunction func); + public T visit(StructNode struct); + public T visit(UnionNode union); + public T visit(TypedefNode typedef); +} diff --git a/net/loveruby/cflat/ast/DefinedFunction.java b/net/loveruby/cflat/ast/DefinedFunction.java index 64b3778..b93487e 100644 --- a/net/loveruby/cflat/ast/DefinedFunction.java +++ b/net/loveruby/cflat/ast/DefinedFunction.java @@ -72,7 +72,7 @@ public class DefinedFunction extends Function { } } - public S accept(ASTVisitor visitor) { + public T accept(DeclarationVisitor visitor) { return visitor.visit(this); } } diff --git a/net/loveruby/cflat/ast/DefinedVariable.java b/net/loveruby/cflat/ast/DefinedVariable.java index 0e990d6..b448936 100644 --- a/net/loveruby/cflat/ast/DefinedVariable.java +++ b/net/loveruby/cflat/ast/DefinedVariable.java @@ -57,7 +57,7 @@ public class DefinedVariable extends Variable { d.printMember("initializer", initializer); } - public S accept(ASTVisitor visitor) { + public T accept(DeclarationVisitor visitor) { return visitor.visit(this); } } diff --git a/net/loveruby/cflat/ast/Entity.java b/net/loveruby/cflat/ast/Entity.java index 44a5a6f..d34d2a3 100644 --- a/net/loveruby/cflat/ast/Entity.java +++ b/net/loveruby/cflat/ast/Entity.java @@ -90,5 +90,5 @@ abstract public class Entity extends Node { return typeNode.location(); } - abstract public S accept(ASTVisitor visitor); + abstract public T accept(DeclarationVisitor visitor); } diff --git a/net/loveruby/cflat/ast/StructNode.java b/net/loveruby/cflat/ast/StructNode.java index 6796900..cf85279 100644 --- a/net/loveruby/cflat/ast/StructNode.java +++ b/net/loveruby/cflat/ast/StructNode.java @@ -21,7 +21,7 @@ public class StructNode extends CompositeTypeDefinition { } // #@@} - public S accept(ASTVisitor visitor) { + public T accept(DeclarationVisitor visitor) { return visitor.visit(this); } } diff --git a/net/loveruby/cflat/ast/TypeDefinition.java b/net/loveruby/cflat/ast/TypeDefinition.java index dced0eb..12c813f 100644 --- a/net/loveruby/cflat/ast/TypeDefinition.java +++ b/net/loveruby/cflat/ast/TypeDefinition.java @@ -33,5 +33,5 @@ abstract public class TypeDefinition extends Node { } abstract public Type definingType(); - abstract public S accept(ASTVisitor visitor); + abstract public T accept(DeclarationVisitor visitor); } diff --git a/net/loveruby/cflat/ast/TypedefNode.java b/net/loveruby/cflat/ast/TypedefNode.java index 4c31891..cb4e402 100644 --- a/net/loveruby/cflat/ast/TypedefNode.java +++ b/net/loveruby/cflat/ast/TypedefNode.java @@ -36,7 +36,7 @@ public class TypedefNode extends TypeDefinition { d.printMember("typeNode", typeNode); } - public S accept(ASTVisitor visitor) { + public T accept(DeclarationVisitor visitor) { return visitor.visit(this); } } diff --git a/net/loveruby/cflat/ast/UndefinedFunction.java b/net/loveruby/cflat/ast/UndefinedFunction.java index f113853..0b17dc3 100644 --- a/net/loveruby/cflat/ast/UndefinedFunction.java +++ b/net/loveruby/cflat/ast/UndefinedFunction.java @@ -25,7 +25,7 @@ public class UndefinedFunction extends Function { d.printMember("params", params); } - public S accept(ASTVisitor visitor) { + public T accept(DeclarationVisitor visitor) { return visitor.visit(this); } } diff --git a/net/loveruby/cflat/ast/UndefinedVariable.java b/net/loveruby/cflat/ast/UndefinedVariable.java index ecb0887..8c9d98e 100644 --- a/net/loveruby/cflat/ast/UndefinedVariable.java +++ b/net/loveruby/cflat/ast/UndefinedVariable.java @@ -16,7 +16,7 @@ public class UndefinedVariable extends Variable { d.printMember("typeNode", typeNode); } - public S accept(ASTVisitor visitor) { + public T accept(DeclarationVisitor visitor) { return visitor.visit(this); } } diff --git a/net/loveruby/cflat/ast/UnionNode.java b/net/loveruby/cflat/ast/UnionNode.java index 571fa09..a73377b 100644 --- a/net/loveruby/cflat/ast/UnionNode.java +++ b/net/loveruby/cflat/ast/UnionNode.java @@ -21,7 +21,7 @@ public class UnionNode extends CompositeTypeDefinition { } // #@@} - public S accept(ASTVisitor visitor) { + public T accept(DeclarationVisitor visitor) { return visitor.visit(this); } } diff --git a/net/loveruby/cflat/compiler/CodeGenerator.java b/net/loveruby/cflat/compiler/CodeGenerator.java index 73d8df6..3c96829 100644 --- a/net/loveruby/cflat/compiler/CodeGenerator.java +++ b/net/loveruby/cflat/compiler/CodeGenerator.java @@ -831,12 +831,6 @@ public class CodeGenerator implements ASTVisitor, ELFConstants { public Void visit(ForNode node) { throw new Error("ForNode"); } public Void visit(BreakNode node) { throw new Error("BreakNode"); } public Void visit(ContinueNode node) { throw new Error("ContinueNode"); } - public Void visit(UndefinedFunction f) { throw new Error("UndefinedFunction"); } - public Void visit(DefinedVariable v) { throw new Error("DefinedVariable"); } - public Void visit(UndefinedVariable v){throw new Error("UndefinedVariable");} - public Void visit(StructNode node) { throw new Error("StructNode"); } - public Void visit(UnionNode node) { throw new Error("UnionNode"); } - public Void visit(TypedefNode node) { throw new Error("TypedefNode"); } // // Expressions diff --git a/net/loveruby/cflat/compiler/IRGenerator.java b/net/loveruby/cflat/compiler/IRGenerator.java index 7aa9bc5..3995294 100644 --- a/net/loveruby/cflat/compiler/IRGenerator.java +++ b/net/loveruby/cflat/compiler/IRGenerator.java @@ -741,30 +741,6 @@ class IRGenerator implements ASTVisitor { // must not reached // - public Void visit(UndefinedFunction func) { - throw new Error("must not happen"); - } - - public Void visit(DefinedVariable var) { - throw new Error("must not happen"); - } - - public Void visit(UndefinedVariable func) { - throw new Error("must not happen"); - } - - public Void visit(StructNode struct) { - throw new Error("must not happen"); - } - - public Void visit(UnionNode union) { - throw new Error("must not happen"); - } - - public Void visit(TypedefNode typedef) { - throw new Error("must not happen"); - } - public Void visit(AssignStmtNode node) { throw new Error("must not happen"); } diff --git a/net/loveruby/cflat/compiler/TypeResolver.java b/net/loveruby/cflat/compiler/TypeResolver.java index 085a526..905123c 100644 --- a/net/loveruby/cflat/compiler/TypeResolver.java +++ b/net/loveruby/cflat/compiler/TypeResolver.java @@ -4,7 +4,7 @@ import net.loveruby.cflat.type.*; import net.loveruby.cflat.exception.*; import java.util.*; -public class TypeResolver extends Visitor { +public class TypeResolver extends Visitor implements DeclarationVisitor { // #@@range/ctor{ protected TypeTable typeTable; protected ErrorHandler errorHandler; @@ -50,6 +50,10 @@ public class TypeResolver extends Visitor { } // #@@} + // + // Declarations + // + // #@@range/StructNode{ public Void visit(StructNode struct) { resolveCompositeType(struct); @@ -84,10 +88,16 @@ public class TypeResolver extends Visitor { } // #@@} + // + // Entities + // + // #@@range/DefinedVariable{ public Void visit(DefinedVariable var) { bindType(var.typeNode()); - super.visit(var); // resolve initializer + if (var.hasInitializer()) { + visitExpr(var.initializer()); + } return null; } // #@@} @@ -124,6 +134,18 @@ public class TypeResolver extends Visitor { } // #@@} + // + // Expressions + // + + public Void visit(BlockNode node) { + for (DefinedVariable var : node.variables()) { + var.accept(this); + } + visitStmts(node.stmts()); + return null; + } + public Void visit(AddressNode node) { super.visit(node); // to avoid SemanticError which occurs when getting type of diff --git a/net/loveruby/cflat/compiler/Visitor.java b/net/loveruby/cflat/compiler/Visitor.java index f782c5d..bd7cd87 100644 --- a/net/loveruby/cflat/compiler/Visitor.java +++ b/net/loveruby/cflat/compiler/Visitor.java @@ -27,48 +27,15 @@ abstract public class Visitor implements ASTVisitor { } } - // - // Declarations - // - - public Void visit(DefinedVariable var) { - if (var.hasInitializer()) { - visitExpr(var.initializer()); - } - return null; - } - - public Void visit(UndefinedVariable var) { - return null; - } - - public Void visit(DefinedFunction func) { - return null; - } - - public Void visit(UndefinedFunction func) { - return null; - } - - public Void visit(StructNode struct) { - return null; - } - - public Void visit(UnionNode union) { - return null; - } - - public Void visit(TypedefNode typedef) { - return null; - } - // // Statements // public Void visit(BlockNode node) { for (DefinedVariable var : node.variables()) { - visit(var); + if (var.hasInitializer()) { + visitExpr(var.initializer()); + } } visitStmts(node.stmts()); return null;