예제 #1
0
파일: op.go 프로젝트: yingmsky/e8vm
func buildUnaryOpExpr(b *builder, expr *ast.OpExpr) *ref {
	op := expr.Op.Lit
	B := b.buildExpr(expr.B)
	if B == nil {
		return nil
	}

	opPos := expr.Op.Pos

	if !B.IsSingle() {
		b.Errorf(opPos, "%q on expression list", op)
		return nil
	}

	btyp := B.Type()
	if types.IsBasic(btyp, types.Int) {
		switch op {
		case "+", "-", "^":
			ret := b.newTemp(types.Int)
			b.b.Arith(ret.IR(), nil, op, B.IR())
			return ret
		default:
			b.Errorf(opPos, "%q on int", op)
			return nil
		}
	} else if types.IsBasic(btyp, types.Bool) {
		switch op {
		case "!":
			ret := b.newTemp(types.Bool)
			b.b.Arith(ret.IR(), nil, op, B.IR())
			return ret
		default:
			b.Errorf(opPos, "%q on boolean", op)
			return nil
		}
	}

	b.Errorf(opPos, "invalid unary operator %q", op)
	return nil
}
예제 #2
0
파일: ref.go 프로젝트: yingmsky/e8vm
func (r *ref) IsBool() bool {
	if !r.IsSingle() {
		return false
	}
	return types.IsBasic(r.Type(), types.Bool)
}