* 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.


git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4153 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2009-04-26 09:09:52 +00:00
parent 68a99258e5
commit eaba86066f
16 changed files with 79 additions and 86 deletions

View File

@ -1,3 +1,35 @@
Sun Apr 26 18:06:52 2009 Minero Aoki <aamine@loveruby.net>
* 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 <aamine@loveruby.net>
* net/loveruby/cflat/compiler/IRGenerator.java (SuffixOp): do not

View File

@ -1,15 +1,6 @@
package net.loveruby.cflat.ast;
public interface ASTVisitor<S, E> {
// 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);

View File

@ -0,0 +1,11 @@
package net.loveruby.cflat.ast;
public interface DeclarationVisitor<T> {
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);
}

View File

@ -72,7 +72,7 @@ public class DefinedFunction extends Function {
}
}
public <S,E> S accept(ASTVisitor<S,E> visitor) {
public <T> T accept(DeclarationVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@ -57,7 +57,7 @@ public class DefinedVariable extends Variable {
d.printMember("initializer", initializer);
}
public <S,E> S accept(ASTVisitor<S,E> visitor) {
public <T> T accept(DeclarationVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@ -90,5 +90,5 @@ abstract public class Entity extends Node {
return typeNode.location();
}
abstract public <S,E> S accept(ASTVisitor<S,E> visitor);
abstract public <T> T accept(DeclarationVisitor<T> visitor);
}

View File

@ -21,7 +21,7 @@ public class StructNode extends CompositeTypeDefinition {
}
// #@@}
public <S,E> S accept(ASTVisitor<S,E> visitor) {
public <T> T accept(DeclarationVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@ -33,5 +33,5 @@ abstract public class TypeDefinition extends Node {
}
abstract public Type definingType();
abstract public <S,E> S accept(ASTVisitor<S,E> visitor);
abstract public <T> T accept(DeclarationVisitor<T> visitor);
}

View File

@ -36,7 +36,7 @@ public class TypedefNode extends TypeDefinition {
d.printMember("typeNode", typeNode);
}
public <S,E> S accept(ASTVisitor<S,E> visitor) {
public <T> T accept(DeclarationVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@ -25,7 +25,7 @@ public class UndefinedFunction extends Function {
d.printMember("params", params);
}
public <S,E> S accept(ASTVisitor<S,E> visitor) {
public <T> T accept(DeclarationVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@ -16,7 +16,7 @@ public class UndefinedVariable extends Variable {
d.printMember("typeNode", typeNode);
}
public <S,E> S accept(ASTVisitor<S,E> visitor) {
public <T> T accept(DeclarationVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@ -21,7 +21,7 @@ public class UnionNode extends CompositeTypeDefinition {
}
// #@@}
public <S,E> S accept(ASTVisitor<S,E> visitor) {
public <T> T accept(DeclarationVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@ -831,12 +831,6 @@ public class CodeGenerator implements ASTVisitor<Void,Void>, 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

View File

@ -741,30 +741,6 @@ class IRGenerator implements ASTVisitor<Void, ExprNode> {
// 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");
}

View File

@ -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<Void> {
// #@@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

View File

@ -27,48 +27,15 @@ abstract public class Visitor implements ASTVisitor<Void, Void> {
}
}
//
// 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;