cbc/net/loveruby/cflat/ast/ArefNode.java

57 lines
1.4 KiB
Java

package net.loveruby.cflat.ast;
import net.loveruby.cflat.type.*;
public class ArefNode extends LHSNode {
private ExprNode expr, index;
public ArefNode(ExprNode expr, ExprNode index) {
this.expr = expr;
this.index = index;
}
public ExprNode expr() { return expr; }
public ExprNode index() { return index; }
// isMultiDimension a[x][y][z] = true.
// isMultiDimension a[x][y] = true.
// isMultiDimension a[x] = false.
public boolean isMultiDimension() {
return (expr instanceof ArefNode) && !expr.origType().isPointer();
}
// Returns base expression of (multi-dimension) array.
// e.g. baseExpr of a[x][y][z] is a.
public ExprNode baseExpr() {
return isMultiDimension() ? ((ArefNode)expr).baseExpr() : expr;
}
// element size of this (multi-dimension) array
public long elementSize() {
return origType().allocSize();
}
public long length() {
return ((ArrayType)expr.origType()).length();
}
protected Type origType() {
return expr.origType().baseType();
}
public Location location() {
return expr.location();
}
protected void _dump(Dumper d) {
if (type != null) {
d.printMember("type", type);
}
d.printMember("expr", expr);
d.printMember("index", index);
}
public <S,E> E accept(ASTVisitor<S,E> visitor) {
return visitor.visit(this);
}
}