mirror of https://github.com/aamine/cbc
* 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:
parent
68a99258e5
commit
eaba86066f
32
ChangeLog
32
ChangeLog
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue